aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClément Bœsch <u@pkh.me>2013-09-08 18:23:44 +0200
committerAlexander Strasser <eclipse7@gmx.net>2013-09-15 22:21:05 +0200
commit0f429392cf412dc89909b216cfbf7f7e9fe72717 (patch)
tree05b35d748a859a1b5b635ce4a8eb2b4360d6ade3
parent2dc6c5d46221dc04e545b7829c32efc093d76bdf (diff)
downloadffmpeg-0f429392cf412dc89909b216cfbf7f7e9fe72717.tar.gz
avcodec/assenc: fix potential overread.
(cherry picked from commit 860a0810583f54ccbde912aebda8711f18eab8eb) Signed-off-by: Alexander Strasser <eclipse7@gmx.net>
-rw-r--r--libavcodec/assenc.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/libavcodec/assenc.c b/libavcodec/assenc.c
index 7b8a540cdd..5dc3b09d65 100644
--- a/libavcodec/assenc.c
+++ b/libavcodec/assenc.c
@@ -80,9 +80,16 @@ static int ass_encode_frame(AVCodecContext *avctx,
* will be "Marked=N" instead of the layer num, so we will
* have layer=0, which is fine. */
layer = strtol(ass, &p, 10);
- if (*p) p += strcspn(p, ",") + 1; // skip layer or marked
- if (*p) p += strcspn(p, ",") + 1; // skip start timestamp
- if (*p) p += strcspn(p, ",") + 1; // skip end timestamp
+
+#define SKIP_ENTRY(ptr) do { \
+ char *sep = strchr(ptr, ','); \
+ if (sep) \
+ ptr = sep + 1; \
+} while (0)
+
+ SKIP_ENTRY(p); // skip layer or marked
+ SKIP_ENTRY(p); // skip start timestamp
+ SKIP_ENTRY(p); // skip end timestamp
snprintf(ass_line, sizeof(ass_line), "%d,%ld,%s", ++s->id, layer, p);
ass_line[strcspn(ass_line, "\r\n")] = 0;
ass = ass_line;