From: Debian Multimedia Maintainers Date: Sun, 7 Apr 2019 16:19:28 +0000 (-0400) Subject: CVE-2018-20763 X-Git-Tag: archive/raspbian/1.0.1+dfsg1-4+rpi1~1^2~39^2~2 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=8d171b618e39381e58f88a9815a9e9640aa711cc;p=gpac.git CVE-2018-20763 commit 1c449a34fe0b50aaffb881bfb9d7c5ab0bb18cdd Author: Aurelien David Date: Fri Jan 11 14:05:16 2019 +0100 Description: CVE-2018-20763 add some boundary checks on gf_text_get_utf8_line (#1188) Gbp-Pq: Name CVE-2018-20763.patch --- diff --git a/src/media_tools/text_import.c b/src/media_tools/text_import.c index cd43e10..9f6fb10 100644 --- a/src/media_tools/text_import.c +++ b/src/media_tools/text_import.c @@ -201,49 +201,76 @@ char *gf_text_get_utf8_line(char *szLine, u32 lineSize, FILE *txt_in, s32 unicod if (unicode_type<=1) { j=0; len = (u32) strlen(szLine); - for (i=0; i> 6) & 0x3 ); - j++; - szLine[i] &= 0xbf; + if (j + 1 < sizeof(szLineConv) - 1) { + szLineConv[j] = 0xc0 | ((szLine[i] >> 6) & 0x3); + j++; + szLine[i] &= 0xbf; + } + else + break; } /*UTF8 2 bytes char*/ else if ( (szLine[i] & 0xe0) == 0xc0) { - szLineConv[j] = szLine[i]; - i++; - j++; + + // don't cut multibyte in the middle in there is no more room in dest + if (j + 1 < sizeof(szLineConv) - 1 && i + 1 < len) { + szLineConv[j] = szLine[i]; + i++; + j++; + } + else { + break; + } } /*UTF8 3 bytes char*/ else if ( (szLine[i] & 0xf0) == 0xe0) { - szLineConv[j] = szLine[i]; - i++; - j++; - szLineConv[j] = szLine[i]; - i++; - j++; + if (j + 2 < sizeof(szLineConv) - 1 && i + 2 < len) { + szLineConv[j] = szLine[i]; + i++; + j++; + szLineConv[j] = szLine[i]; + i++; + j++; + } + else { + break; + } } /*UTF8 4 bytes char*/ else if ( (szLine[i] & 0xf8) == 0xf0) { - szLineConv[j] = szLine[i]; - i++; - j++; - szLineConv[j] = szLine[i]; - i++; - j++; - szLineConv[j] = szLine[i]; - i++; - j++; + if (j + 3 < sizeof(szLineConv) - 1 && i + 3 < len) { + szLineConv[j] = szLine[i]; + i++; + j++; + szLineConv[j] = szLine[i]; + i++; + j++; + szLineConv[j] = szLine[i]; + i++; + j++; + } + else { + break; + } } else { i+=1; continue; } } - szLineConv[j] = szLine[i]; - j++; + if (j < sizeof(szLineConv)-1 && i= sizeof(szLineConv)) + szLineConv[sizeof(szLineConv) - 1] = 0; + else + szLineConv[j] = 0; + strcpy(szLine, szLineConv); return sOK; }