diff options
author | Mike DePaulo <mikedep333@gmail.com> | 2015-02-08 20:28:30 -0500 |
---|---|---|
committer | Mike Gabriel <mike.gabriel@das-netzwerkteam.de> | 2015-02-14 16:14:31 +0100 |
commit | f53f2474d5d33cca04c4c7744ecc50cec41ba94f (patch) | |
tree | c579b648466bb320434ea70f03deab56c5446d14 /nx-X11/lib/font/fontfile/fontdir.c | |
parent | ac6694378e0ed4bdffa6e1318c9d4beda24a6b0e (diff) | |
download | nx-libs-f53f2474d5d33cca04c4c7744ecc50cec41ba94f.tar.gz nx-libs-f53f2474d5d33cca04c4c7744ecc50cec41ba94f.tar.bz2 nx-libs-f53f2474d5d33cca04c4c7744ecc50cec41ba94f.zip |
CVE-2014-0209: integer overflow of realloc() size in FontFileAddEntry() from xorg/lib/libXfont commit 2f5e57317339c526e6eaee1010b0e2ab8089c42e
FontFileReadDirectory() opens a fonts.dir file, and reads over every
line in an fscanf loop. For each successful entry read (font name,
file name) a call is made to FontFileAddFontFile().
FontFileAddFontFile() will add a font file entry (for the font name
and file) each time it’s called, by calling FontFileAddEntry().
FontFileAddEntry() will do the actual adding. If the table it has
to add to is full, it will do a realloc, adding 100 more entries
to the table size without checking to see if that will overflow the
int used to store the size.
Diffstat (limited to 'nx-X11/lib/font/fontfile/fontdir.c')
-rw-r--r-- | nx-X11/lib/font/fontfile/fontdir.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/nx-X11/lib/font/fontfile/fontdir.c b/nx-X11/lib/font/fontfile/fontdir.c index 8f75d8bde..899ff05ef 100644 --- a/nx-X11/lib/font/fontfile/fontdir.c +++ b/nx-X11/lib/font/fontfile/fontdir.c @@ -185,6 +185,11 @@ FontFileAddEntry(FontTablePtr table, FontEntryPtr prototype) if (table->sorted) return (FontEntryPtr) 0; /* "cannot" happen */ if (table->used == table->size) { + if (table->size >= ((INT32_MAX / sizeof(FontEntryRec)) - 100)) + /* If we've read so many entries we're going to ask for 2gb + or more of memory, something is so wrong with this font + directory that we should just give up before we overflow. */ + return NULL; newsize = table->size + 100; entry = (FontEntryPtr) xrealloc(table->entries, newsize * sizeof(FontEntryRec)); |