8b0cecffd609155b86d20aeb0fcdfca120249995
[proj/kde-sunset.git] / kde-base / kpdf / files / kpdf-3.5.10-xpdf-3.02pl4.patch
1 Adaptation of xpdf 3.02pl4 to kpdf.
2
3 2009-11-12 Martin von Gagern
4 References:
5 ftp://ftp.foolabs.com/pub/xpdf/xpdf-3.02pl4.patch
6 https://bugs.gentoo.org/290470
7 http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-3603
8 http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-3604
9 http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-3606
10 http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-3608
11
12 Index: kpdf-3.5.10/kpdf/xpdf/splash/Splash.cc
13 ===================================================================
14 --- kpdf-3.5.10.orig/kpdf/xpdf/splash/Splash.cc
15 +++ kpdf-3.5.10/kpdf/xpdf/splash/Splash.cc
16 @@ -12,6 +12,7 @@
17  
18  #include <stdlib.h>
19  #include <string.h>
20 +#include <limits.h>
21  #include "gmem.h"
22  #include "SplashErrorCodes.h"
23  #include "SplashMath.h"
24 @@ -1937,7 +1938,10 @@ SplashError Splash::fillImageMask(Splash
25    xq = w % scaledWidth;
26  
27    // allocate pixel buffer
28 -  pixBuf = (SplashColorPtr)gmalloc((yp + 1) * w);
29 +  if (yp < 0 || yp > INT_MAX - 1) {
30 +    return splashErrBadArg;
31 +  }
32 +  pixBuf = (SplashColorPtr)gmallocn(yp + 1, w);
33  
34    // initialize the pixel pipe
35    pipeInit(&pipe, 0, 0, state->fillPattern, NULL, state->fillAlpha,
36 @@ -2233,9 +2237,12 @@ SplashError Splash::drawImage(SplashImag
37    xq = w % scaledWidth;
38  
39    // allocate pixel buffers
40 -  colorBuf = (SplashColorPtr)gmalloc((yp + 1) * w * nComps);
41 +  if (yp < 0 || yp > INT_MAX - 1 || w > INT_MAX / nComps) {
42 +    return splashErrBadArg;
43 +  }
44 +  colorBuf = (SplashColorPtr)gmallocn(yp + 1, w * nComps);
45    if (srcAlpha) {
46 -    alphaBuf = (Guchar *)gmalloc((yp + 1) * w);
47 +    alphaBuf = (Guchar *)gmallocn(yp + 1, w);
48    } else {
49      alphaBuf = NULL;
50    }
51 Index: kpdf-3.5.10/kpdf/xpdf/splash/SplashBitmap.cc
52 ===================================================================
53 --- kpdf-3.5.10.orig/kpdf/xpdf/splash/SplashBitmap.cc
54 +++ kpdf-3.5.10/kpdf/xpdf/splash/SplashBitmap.cc
55 @@ -11,6 +11,7 @@
56  #endif
57  
58  #include <stdio.h>
59 +#include <limits.h>
60  #include "gmem.h"
61  #include "SplashErrorCodes.h"
62  #include "SplashBitmap.h"
63 @@ -27,30 +28,48 @@ SplashBitmap::SplashBitmap(int widthA, i
64    mode = modeA;
65    switch (mode) {
66    case splashModeMono1:
67 -    rowSize = (width + 7) >> 3;
68 +    if (width > 0) {
69 +      rowSize = (width + 7) >> 3;
70 +    } else {
71 +      rowSize = -1;
72 +    }
73      break;
74    case splashModeMono8:
75 -    rowSize = width;
76 +    if (width > 0) {
77 +      rowSize = width;
78 +    } else {
79 +      rowSize = -1;
80 +    }
81      break;
82    case splashModeRGB8:
83    case splashModeBGR8:
84 -    rowSize = width * 3;
85 +    if (width > 0 && width <= INT_MAX / 3) {
86 +      rowSize = width * 3;
87 +    } else {
88 +      rowSize = -1;
89 +    }
90      break;
91  #if SPLASH_CMYK
92    case splashModeCMYK8:
93 -    rowSize = width * 4;
94 +    if (width > 0 && width <= INT_MAX / 4) {
95 +      rowSize = width * 4;
96 +    } else {
97 +      rowSize = -1;
98 +    }
99      break;
100  #endif
101    }
102 -  rowSize += rowPad - 1;
103 -  rowSize -= rowSize % rowPad;
104 -  data = (SplashColorPtr)gmallocn(rowSize, height);
105 +  if (rowSize > 0) {
106 +    rowSize += rowPad - 1;
107 +    rowSize -= rowSize % rowPad;
108 +  }
109 +  data = (SplashColorPtr)gmallocn(height, rowSize);
110    if (!topDown) {
111      data += (height - 1) * rowSize;
112      rowSize = -rowSize;
113    }
114    if (alphaA) {
115 -    alpha = (Guchar *)gmalloc(width * height);
116 +    alpha = (Guchar *)gmallocn(width, height);
117    } else {
118      alpha = NULL;
119    }
120 Index: kpdf-3.5.10/kpdf/xpdf/splash/SplashErrorCodes.h
121 ===================================================================
122 --- kpdf-3.5.10.orig/kpdf/xpdf/splash/SplashErrorCodes.h
123 +++ kpdf-3.5.10/kpdf/xpdf/splash/SplashErrorCodes.h
124 @@ -31,4 +31,6 @@
125  
126  #define splashErrZeroImage       9      // image of 0x0
127  
128 +#define splashErrBadArg          9     // bad argument
129 +
130  #endif
131 Index: kpdf-3.5.10/kpdf/xpdf/xpdf/PSOutputDev.cc
132 ===================================================================
133 --- kpdf-3.5.10.orig/kpdf/xpdf/xpdf/PSOutputDev.cc
134 +++ kpdf-3.5.10/kpdf/xpdf/xpdf/PSOutputDev.cc
135 @@ -4386,7 +4386,7 @@ void PSOutputDev::doImageL1Sep(GfxImageC
136              width, -height, height);
137  
138    // allocate a line buffer
139 -  lineBuf = (Guchar *)gmalloc(4 * width);
140 +  lineBuf = (Guchar *)gmallocn(width, 4);
141  
142    // set up to process the data stream
143    imgStr = new ImageStream(str, width, colorMap->getNumPixelComps(),
144 Index: kpdf-3.5.10/kpdf/xpdf/xpdf/Stream.cc
145 ===================================================================
146 --- kpdf-3.5.10.orig/kpdf/xpdf/xpdf/Stream.cc
147 +++ kpdf-3.5.10/kpdf/xpdf/xpdf/Stream.cc
148 @@ -323,6 +323,10 @@ ImageStream::ImageStream(Stream *strA, i
149    } else {
150      imgLineSize = nVals;
151    }
152 +  if (width > INT_MAX / nComps) {
153 +    // force a call to gmallocn(-1,...), which will throw an exception
154 +    imgLineSize = -1;
155 +  }
156    imgLine = (Guchar *)gmallocn(imgLineSize, sizeof(Guchar));
157    imgIdx = nVals;
158  }
159 Index: kpdf-3.5.10/kpdf/xpdf/xpdf/XRef.cc
160 ===================================================================
161 --- kpdf-3.5.10.orig/kpdf/xpdf/xpdf/XRef.cc
162 +++ kpdf-3.5.10/kpdf/xpdf/xpdf/XRef.cc
163 @@ -52,6 +52,8 @@ public:
164    // generation 0.
165    ObjectStream(XRef *xref, int objStrNumA);
166  
167 +  GBool isOk() { return ok; }
168 +
169    ~ObjectStream();
170  
171    // Return the object number of this object stream.
172 @@ -67,6 +69,7 @@ private:
173    int nObjects;                        // number of objects in the stream
174    Object *objs;                        // the objects (length = nObjects)
175    int *objNums;                        // the object numbers (length = nObjects)
176 +  GBool ok;
177  };
178  
179  ObjectStream::ObjectStream(XRef *xref, int objStrNumA) {
180 @@ -80,6 +83,7 @@ ObjectStream::ObjectStream(XRef *xref, i
181    nObjects = 0;
182    objs = NULL;
183    objNums = NULL;
184 +  ok = gFalse;
185  
186    if (!xref->fetch(objStrNum, 0, &objStr)->isStream()) {
187      goto err1;
188 @@ -105,6 +109,13 @@ ObjectStream::ObjectStream(XRef *xref, i
189      goto err1;
190    }
191  
192 +  // this is an arbitrary limit to avoid integer overflow problems
193 +  // in the 'new Object[nObjects]' call (Acrobat apparently limits
194 +  // object streams to 100-200 objects)
195 +  if (nObjects > 1000000) {
196 +    error(-1, "Too many objects in an object stream");
197 +    goto err1;
198 +  }
199    objs = new Object[nObjects];
200    objNums = (int *)gmallocn(nObjects, sizeof(int));
201    offsets = (int *)gmallocn(nObjects, sizeof(int));
202 @@ -161,10 +172,10 @@ ObjectStream::ObjectStream(XRef *xref, i
203    }
204  
205    gfree(offsets);
206 +  ok = gTrue;
207  
208   err1:
209    objStr.free();
210 -  return;
211  }
212  
213  ObjectStream::~ObjectStream() {
214 @@ -837,6 +848,11 @@ Object *XRef::fetch(int num, int gen, Ob
215         delete objStr;
216        }
217        objStr = new ObjectStream(this, e->offset);
218 +      if (!objStr->isOk()) {
219 +       delete objStr;
220 +       objStr = NULL;
221 +       goto err;
222 +      }
223      }
224      objStr->getObject(e->gen, num, obj);
225      break;