[FFmpeg-cvslog] avcodec/htmlsubtitles: Fixes denial of service due to use of sscanf in inner loop for tag scaning
Kevin Backhouse via RT
git at videolan.org
Tue May 14 01:44:42 EEST 2019
ffmpeg | branch: release/3.2 | Kevin Backhouse via RT <security-reports at semmle.com> | Wed Feb 6 11:29:22 2019 +0000| [23ccf3cabb4baf6e8af4b1af3fcc59c904736f21] | committer: Michael Niedermayer
avcodec/htmlsubtitles: Fixes denial of service due to use of sscanf in inner loop for tag scaning
Fixes: [Semmle Security Reports #19438]
Fixes: dos_sscanf1.mkv
Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>
(cherry picked from commit 1f00c97bc3475c477f3c468cf2d924d5761d0982)
Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=23ccf3cabb4baf6e8af4b1af3fcc59c904736f21
---
libavcodec/htmlsubtitles.c | 30 +++++++++++++++++++++++++++++-
1 file changed, 29 insertions(+), 1 deletion(-)
diff --git a/libavcodec/htmlsubtitles.c b/libavcodec/htmlsubtitles.c
index 4c9e4f3e76..80d0f40553 100644
--- a/libavcodec/htmlsubtitles.c
+++ b/libavcodec/htmlsubtitles.c
@@ -51,6 +51,34 @@ static void rstrip_spaces_buf(AVBPrint *buf)
buf->str[--buf->len] = 0;
}
+/*
+ * Fast code for scanning the rest of a tag. Functionally equivalent to
+ * this sscanf call:
+ *
+ * sscanf(in, "%127[^<>]>%n", buffer, lenp) == 2
+ */
+static int scantag(const char* in, char* buffer, int* lenp) {
+ int len;
+
+ for (len = 0; len < 128; len++) {
+ const char c = *in++;
+ switch (c) {
+ case '\0':
+ return 0;
+ case '<':
+ return 0;
+ case '>':
+ buffer[len] = '\0';
+ *lenp = len+1;
+ return 1;
+ default:
+ break;
+ }
+ buffer[len] = c;
+ }
+ return 0;
+}
+
int ff_htmlmarkup_to_ass(void *log_ctx, AVBPrint *dst, const char *in)
{
char *param, buffer[128], tmp[128];
@@ -102,7 +130,7 @@ int ff_htmlmarkup_to_ass(void *log_ctx, AVBPrint *dst, const char *in)
case '<':
tag_close = in[1] == '/';
len = 0;
- if (sscanf(in+tag_close+1, "%127[^<>]>%n", buffer, &len) >= 1 && len > 0) {
+ if (scantag(in+tag_close+1, buffer, &len) && len > 0) {
const char *tagname = buffer;
while (*tagname == ' ')
tagname++;
More information about the ffmpeg-cvslog
mailing list