[FFmpeg-cvslog] avformat/dump: Avoid unnecessary implicit calculation of strlen

Andreas Rheinhardt git at videolan.org
Wed Sep 14 16:22:37 EEST 2022


ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinhardt at outlook.com> | Wed Sep 14 02:21:41 2022 +0200| [62af385b917f2474498abeabd6057e6c60e2b9a9] | committer: Andreas Rheinhardt

avformat/dump: Avoid unnecessary implicit calculation of strlen

av_strlcpy() returns the length of the src string to enable
the caller to check for truncation. It is currently used in
the following way in dump_metadata(): Every metadata value
is searched for \b, \n, \v, \f, \r and then the data up to
the first of these characters found is copied to a small
temporary buffer via av_strlcpy() (but of course not more
than fits into said buffer) and then printed; all characters up
to the character found earlier are then treated as consumed.

But this is bad performance-wise if the while string is big
and contains many of these characters, because av_strlcpy()
will unnecessarily calculate the length of the whole remaining string.
(dump_metadata() actually ignored the return value of av_strlcpy().)

Fix this by not copying the data to a temporary buffer at all.
Instead just use %.*s to bound the number of characters output.

Reviewed-by: Paul B Mahol <onemda at gmail.com>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=62af385b917f2474498abeabd6057e6c60e2b9a9
---

 libavformat/dump.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/libavformat/dump.c b/libavformat/dump.c
index e3f0056c20..cafcef36c6 100644
--- a/libavformat/dump.c
+++ b/libavformat/dump.c
@@ -145,10 +145,8 @@ static void dump_metadata(void *ctx, const AVDictionary *m, const char *indent)
                 av_log(ctx, AV_LOG_INFO,
                        "%s  %-16s: ", indent, tag->key);
                 while (*p) {
-                    char tmp[256];
                     size_t len = strcspn(p, "\x8\xa\xb\xc\xd");
-                    av_strlcpy(tmp, p, FFMIN(sizeof(tmp), len+1));
-                    av_log(ctx, AV_LOG_INFO, "%s", tmp);
+                    av_log(ctx, AV_LOG_INFO, "%.*s", (int)(FFMIN(255, len)), p);
                     p += len;
                     if (*p == 0xd) av_log(ctx, AV_LOG_INFO, " ");
                     if (*p == 0xa) av_log(ctx, AV_LOG_INFO, "\n%s  %-16s: ", indent, "");



More information about the ffmpeg-cvslog mailing list