summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2016-12-28 13:20:16 +0100
committerTor Andersson <tor.andersson@artifex.com>2017-01-09 13:21:40 +0100
commit7a439812b2226c1e3b203ec603f05b39d159f91e (patch)
tree527c9875c6befd905ffba752079c51c0799a8d7a
parentbbcc85a9f746c161b2e23c6057e69ec7b967252b (diff)
downloadmupdf-7a439812b2226c1e3b203ec603f05b39d159f91e.tar.xz
Fix potential buffer overrun when decoding UTF-16 in XML parser.
-rw-r--r--include/mupdf/fitz/string.h5
-rw-r--r--source/fitz/xml.c4
2 files changed, 7 insertions, 2 deletions
diff --git a/include/mupdf/fitz/string.h b/include/mupdf/fitz/string.h
index 358701d1..c9c20c3d 100644
--- a/include/mupdf/fitz/string.h
+++ b/include/mupdf/fitz/string.h
@@ -80,6 +80,11 @@ void fz_format_output_path(fz_context *ctx, char *path, size_t size, const char
char *fz_cleanname(char *name);
/*
+ FZ_UTFMAX: Maximum number of bytes in a decoded rune (maximum length returned by fz_chartorune).
+*/
+enum { FZ_UTFMAX = 4 };
+
+/*
fz_chartorune: UTF8 decode a single rune from a sequence of chars.
rune: Pointer to an int to assign the decoded 'rune' to.
diff --git a/source/fitz/xml.c b/source/fitz/xml.c
index 47b9461b..d063ee33 100644
--- a/source/fitz/xml.c
+++ b/source/fitz/xml.c
@@ -593,7 +593,7 @@ static char *convert_to_utf8(fz_context *doc, unsigned char *s, size_t n, int *d
if (s[0] == 0xFE && s[1] == 0xFF) {
s += 2;
- dst = d = fz_malloc(doc, n * 2);
+ dst = d = fz_malloc(doc, n * FZ_UTFMAX);
while (s + 1 < e) {
c = s[0] << 8 | s[1];
d += fz_runetochar(d, c);
@@ -606,7 +606,7 @@ static char *convert_to_utf8(fz_context *doc, unsigned char *s, size_t n, int *d
if (s[0] == 0xFF && s[1] == 0xFE) {
s += 2;
- dst = d = fz_malloc(doc, n * 2);
+ dst = d = fz_malloc(doc, n * FZ_UTFMAX);
while (s + 1 < e) {
c = s[0] | s[1] << 8;
d += fz_runetochar(d, c);