diff options
Diffstat (limited to 'app-text/texlive/files/2005/texlive-2005-xpdf-vulnerabilities.patch')
-rw-r--r-- | app-text/texlive/files/2005/texlive-2005-xpdf-vulnerabilities.patch | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/app-text/texlive/files/2005/texlive-2005-xpdf-vulnerabilities.patch b/app-text/texlive/files/2005/texlive-2005-xpdf-vulnerabilities.patch new file mode 100644 index 000000000000..7ad201d4e2d2 --- /dev/null +++ b/app-text/texlive/files/2005/texlive-2005-xpdf-vulnerabilities.patch @@ -0,0 +1,143 @@ +diff -urN TeX.orig/libs/xpdf/xpdf/JBIG2Stream.cc TeX/libs/xpdf/xpdf/JBIG2Stream.cc +--- TeX.orig/libs/xpdf/xpdf/JBIG2Stream.cc 2005-08-17 07:34:31.000000000 +0200 ++++ TeX/libs/xpdf/xpdf/JBIG2Stream.cc 2006-05-28 23:52:10.000000000 +0200 +@@ -7,6 +7,7 @@ + //======================================================================== + + #include <aconf.h> ++#include <limits.h> + + #ifdef USE_GCC_PRAGMAS + #pragma implementation +@@ -681,6 +682,11 @@ + w = wA; + h = hA; + line = (wA + 7) >> 3; ++ if (h < 0 || line <= 0 || h >= (INT_MAX - 1) / line) { ++ error(-1, "invalid width/height"); ++ data = NULL; ++ return; ++ } + // need to allocate one extra guard byte for use in combine() + data = (Guchar *)gmalloc(h * line + 1); + data[h * line] = 0; +@@ -692,6 +698,11 @@ + w = bitmap->w; + h = bitmap->h; + line = bitmap->line; ++ if (h < 0 || line <= 0 || h >= (INT_MAX - 1) / line) { ++ error(-1, "invalid width/height"); ++ data = NULL; ++ return; ++ } + // need to allocate one extra guard byte for use in combine() + data = (Guchar *)gmalloc(h * line + 1); + memcpy(data, bitmap->data, h * line); +@@ -720,7 +731,10 @@ + } + + void JBIG2Bitmap::expand(int newH, Guint pixel) { +- if (newH <= h) { ++ if (newH <= h || line <= 0 || newH >= (INT_MAX - 1) / line) { ++ error(-1, "invalid width/height"); ++ gfree(data); ++ data = NULL; + return; + } + // need to allocate one extra guard byte for use in combine() +@@ -2936,6 +2950,11 @@ + JBIG2BitmapPtr tpgrCXPtr0, tpgrCXPtr1, tpgrCXPtr2; + int x, y, pix; + ++ if (w < 0 || h <= 0 || w >= INT_MAX / h) { ++ error(-1, "invalid width/height"); ++ return NULL; ++ } ++ + bitmap = new JBIG2Bitmap(0, w, h); + bitmap->clearToZero(); + +diff -urN TeX.orig/libs/xpdf/xpdf/JPXStream.cc TeX/libs/xpdf/xpdf/JPXStream.cc +--- TeX.orig/libs/xpdf/xpdf/JPXStream.cc 2005-08-17 07:34:31.000000000 +0200 ++++ TeX/libs/xpdf/xpdf/JPXStream.cc 2006-05-28 23:44:00.000000000 +0200 +@@ -7,6 +7,7 @@ + //======================================================================== + + #include <aconf.h> ++#include <limits.h> + + #ifdef USE_GCC_PRAGMAS + #pragma implementation +diff -urN TeX.orig/libs/xpdf/xpdf/Stream.cc TeX/libs/xpdf/xpdf/Stream.cc +--- TeX.orig/libs/xpdf/xpdf/Stream.cc 2005-08-17 07:34:31.000000000 +0200 ++++ TeX/libs/xpdf/xpdf/Stream.cc 2006-05-28 23:49:26.000000000 +0200 +@@ -7,6 +7,7 @@ + //======================================================================== + + #include <aconf.h> ++#include <limits.h> + + #ifdef USE_GCC_PRAGMAS + #pragma implementation +@@ -1256,8 +1257,9 @@ + endOfLine = endOfLineA; + byteAlign = byteAlignA; + columns = columnsA; +- if (columns < 1) { +- columns = 1; ++ if (columns < 1 || columns >= INT_MAX / sizeof(short)) { ++ error (-1, "invalid number of columns: %d\n", columns); ++ exit (1); + } + rows = rowsA; + endOfBlock = endOfBlockA; +@@ -2925,6 +2927,10 @@ + height = read16(); + width = read16(); + numComps = str->getChar(); ++ if (numComps <= 0 || numComps > 4) { ++ error(getPos(), "Bad number of components in DCT stream", prec); ++ return gFalse; ++ } + if (prec != 8) { + error(getPos(), "Bad DCT precision %d", prec); + return gFalse; +@@ -2947,6 +2953,11 @@ + + length = read16() - 2; + scanInfo.numComps = str->getChar(); ++ if (scanInfo.numComps <= 0 || scanInfo.numComps > 4) { ++ scanInfo.numComps = 0; ++ error(getPos(), "Bad number of components in DCT stream"); ++ return gFalse; ++ } + --length; + if (length != 2 * scanInfo.numComps + 3) { + error(getPos(), "Bad DCT scan info block"); +@@ -3031,12 +3042,12 @@ + while (length > 0) { + index = str->getChar(); + --length; +- if ((index & 0x0f) >= 4) { ++ if ((index & 0x10) >= 4 || (index & 0x10) < 0) { + error(getPos(), "Bad DCT Huffman table"); + return gFalse; + } + if (index & 0x10) { +- index &= 0x0f; ++ index &= 0x03; + if (index >= numACHuffTables) + numACHuffTables = index+1; + tbl = &acHuffTables[index]; +@@ -3154,9 +3165,11 @@ + do { + do { + c = str->getChar(); ++ if (c == EOF) return EOF; + } while (c != 0xff && c != EOF); + do { + c = str->getChar(); ++ if (c == EOF) return EOF; + } while (c == 0xff); + } while (c == 0x00); + return c; |