diff options
Diffstat (limited to 'kde-base/kpdf/files/kdegraphics_kpdf-r983313.patch')
-rw-r--r-- | kde-base/kpdf/files/kdegraphics_kpdf-r983313.patch | 892 |
1 files changed, 0 insertions, 892 deletions
diff --git a/kde-base/kpdf/files/kdegraphics_kpdf-r983313.patch b/kde-base/kpdf/files/kdegraphics_kpdf-r983313.patch deleted file mode 100644 index 0f2c30bb..00000000 --- a/kde-base/kpdf/files/kdegraphics_kpdf-r983313.patch +++ /dev/null @@ -1,892 +0,0 @@ -Changes between KDE 3.5.10 tag and KDE 3.5 branch r983313. -Only looking at subdirectory kdegraphics/kpdf here. -Logs since r849627 of the branch but this might be wrong. - -r983313 | mueller -latest round of xpdf fixes - M xpdf/goo/gmem.cc - M xpdf/xpdf/JBIG2Stream.cc - M xpdf/xpdf/JBIG2Stream.h - - -Index: xpdf/xpdf/JBIG2Stream.cc -=================================================================== ---- kdegraphics/kpdf/xpdf/xpdf/JBIG2Stream.cc (.../tags/KDE/3.5.10) (revision 850549) -+++ kdegraphics/kpdf/xpdf/xpdf/JBIG2Stream.cc (.../branches/KDE/3.5) (revision 983313) -@@ -422,12 +422,14 @@ - table[i] = table[len]; - - // assign prefixes -- i = 0; -- prefix = 0; -- table[i++].prefix = prefix++; -- for (; table[i].rangeLen != jbig2HuffmanEOT; ++i) { -- prefix <<= table[i].prefixLen - table[i-1].prefixLen; -- table[i].prefix = prefix++; -+ if (table[0].rangeLen != jbig2HuffmanEOT) { -+ i = 0; -+ prefix = 0; -+ table[i++].prefix = prefix++; -+ for (; table[i].rangeLen != jbig2HuffmanEOT; ++i) { -+ prefix <<= table[i].prefixLen - table[i-1].prefixLen; -+ table[i].prefix = prefix++; -+ } - } - } - -@@ -491,7 +493,7 @@ - } - if (p->bits < 0) { - error(str->getPos(), "Bad two dim code in JBIG2 MMR stream"); -- return 0; -+ return EOF; - } - bufLen -= p->bits; - return p->n; -@@ -684,8 +686,9 @@ - h = hA; - line = (wA + 7) >> 3; - if (w <= 0 || h <= 0 || line <= 0 || h >= (INT_MAX - 1) / line) { -- data = NULL; -- return; -+ // force a call to gmalloc(-1), which will throw an exception -+ h = -1; -+ line = 2; - } - // need to allocate one extra guard byte for use in combine() - data = (Guchar *)gmalloc(h * line + 1); -@@ -699,8 +702,9 @@ - h = bitmap->h; - line = bitmap->line; - if (w <= 0 || h <= 0 || line <= 0 || h >= (INT_MAX - 1) / line) { -- data = NULL; -- return; -+ // force a call to gmalloc(-1), which will throw an exception -+ h = -1; -+ line = 2; - } - // need to allocate one extra guard byte for use in combine() - data = (Guchar *)gmalloc(h * line + 1); -@@ -755,6 +759,8 @@ - inline void JBIG2Bitmap::getPixelPtr(int x, int y, JBIG2BitmapPtr *ptr) { - if (y < 0 || y >= h || x >= w) { - ptr->p = NULL; -+ ptr->shift = 0; // make gcc happy -+ ptr->x = 0; // make gcc happy - } else if (x < 0) { - ptr->p = &data[y * line]; - ptr->shift = 7; -@@ -799,6 +805,10 @@ - Guint src0, src1, src, dest, s1, s2, m1, m2, m3; - GBool oneByte; - -+ // check for the pathological case where y = -2^31 -+ if (y < -0x7fffffff) { -+ return; -+ } - if (y < 0) { - y0 = -y; - } else { -@@ -1012,8 +1022,13 @@ - JBIG2SymbolDict::JBIG2SymbolDict(Guint segNumA, Guint sizeA): - JBIG2Segment(segNumA) - { -+ Guint i; -+ - size = sizeA; - bitmaps = (JBIG2Bitmap **)gmallocn(size, sizeof(JBIG2Bitmap *)); -+ for (i = 0; i < size; ++i) { -+ bitmaps[i] = NULL; -+ } - genericRegionStats = NULL; - refinementRegionStats = NULL; - } -@@ -1022,7 +1037,9 @@ - Guint i; - - for (i = 0; i < size; ++i) { -- delete bitmaps[i]; -+ if (bitmaps[i]) { -+ delete bitmaps[i]; -+ } - } - gfree(bitmaps); - if (genericRegionStats) { -@@ -1301,6 +1318,13 @@ - // keep track of the start of the segment data - segDataPos = getPos(); - -+ // check for missing page information segment -+ if (!pageBitmap && ((segType >= 4 && segType <= 7) || -+ (segType >= 20 && segType <= 43))) { -+ error(getPos(), "First JBIG2 segment associated with a page must be a page information segment"); -+ goto syntaxError; -+ } -+ - // read the segment data - switch (segType) { - case 0: -@@ -1455,6 +1479,8 @@ - Guint i, j, k; - Guchar *p; - -+ symWidths = NULL; -+ - // symbol dictionary flags - if (!readUWord(&flags)) { - goto eofError; -@@ -1510,26 +1536,32 @@ - codeTables = new GList(); - numInputSyms = 0; - for (i = 0; i < nRefSegs; ++i) { -- // This is need by poppler bug 12014, returning gFalse makes it not crash -- // but we end up with a empty page while acroread is able to render -- // part of it - if ((seg = findSegment(refSegs[i]))) { - if (seg->getType() == jbig2SegSymbolDict) { -- numInputSyms += ((JBIG2SymbolDict *)seg)->getSize(); -+ j = ((JBIG2SymbolDict *)seg)->getSize(); -+ if (numInputSyms > UINT_MAX - j) { -+ error(getPos(), "Too many input symbols in JBIG2 symbol dictionary"); -+ delete codeTables; -+ goto eofError; -+ } -+ numInputSyms += j; - } else if (seg->getType() == jbig2SegCodeTable) { -- codeTables->append(seg); -+ codeTables->append(seg); - } -- } else { -- return gFalse; - } - } -+ if (numInputSyms > UINT_MAX - numNewSyms) { -+ error(getPos(), "Too many input symbols in JBIG2 symbol dictionary"); -+ delete codeTables; -+ goto eofError; -+ } - - // compute symbol code length -- symCodeLen = 0; -- i = 1; -- while (i < numInputSyms + numNewSyms) { -+ symCodeLen = 1; -+ i = (numInputSyms + numNewSyms) >> 1; -+ while (i) { - ++symCodeLen; -- i <<= 1; -+ i >>= 1; - } - - // get the input symbol bitmaps -@@ -1541,11 +1573,12 @@ - k = 0; - inputSymbolDict = NULL; - for (i = 0; i < nRefSegs; ++i) { -- seg = findSegment(refSegs[i]); -- if (seg->getType() == jbig2SegSymbolDict) { -- inputSymbolDict = (JBIG2SymbolDict *)seg; -- for (j = 0; j < inputSymbolDict->getSize(); ++j) { -- bitmaps[k++] = inputSymbolDict->getBitmap(j); -+ if ((seg = findSegment(refSegs[i]))) { -+ if (seg->getType() == jbig2SegSymbolDict) { -+ inputSymbolDict = (JBIG2SymbolDict *)seg; -+ for (j = 0; j < inputSymbolDict->getSize(); ++j) { -+ bitmaps[k++] = inputSymbolDict->getBitmap(j); -+ } - } - } - } -@@ -1560,6 +1593,9 @@ - } else if (huffDH == 1) { - huffDHTable = huffTableE; - } else { -+ if (i >= (Guint)codeTables->getLength()) { -+ goto codeTableError; -+ } - huffDHTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); - } - if (huffDW == 0) { -@@ -1567,17 +1603,26 @@ - } else if (huffDW == 1) { - huffDWTable = huffTableC; - } else { -+ if (i >= (Guint)codeTables->getLength()) { -+ goto codeTableError; -+ } - huffDWTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); - } - if (huffBMSize == 0) { - huffBMSizeTable = huffTableA; - } else { -+ if (i >= (Guint)codeTables->getLength()) { -+ goto codeTableError; -+ } - huffBMSizeTable = - ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); - } - if (huffAggInst == 0) { - huffAggInstTable = huffTableA; - } else { -+ if (i >= (Guint)codeTables->getLength()) { -+ goto codeTableError; -+ } - huffAggInstTable = - ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); - } -@@ -1610,7 +1655,6 @@ - } - - // allocate symbol widths storage -- symWidths = NULL; - if (huff && !refAgg) { - symWidths = (Guint *)gmallocn(numNewSyms, sizeof(Guint)); - } -@@ -1652,6 +1696,10 @@ - goto syntaxError; - } - symWidth += dw; -+ if (i >= numNewSyms) { -+ error(getPos(), "Too many symbols in JBIG2 symbol dictionary"); -+ goto syntaxError; -+ } - - // using a collective bitmap, so don't read a bitmap here - if (huff && !refAgg) { -@@ -1688,6 +1736,10 @@ - arithDecoder->decodeInt(&refDX, iardxStats); - arithDecoder->decodeInt(&refDY, iardyStats); - } -+ if (symID >= numInputSyms + i) { -+ error(getPos(), "Invalid symbol ID in JBIG2 symbol dictionary"); -+ goto syntaxError; -+ } - refBitmap = bitmaps[symID]; - bitmaps[numInputSyms + i] = - readGenericRefinementRegion(symWidth, symHeight, -@@ -1754,6 +1806,12 @@ - } else { - arithDecoder->decodeInt(&run, iaexStats); - } -+ if (i + run > numInputSyms + numNewSyms || -+ (ex && j + run > numExSyms)) { -+ error(getPos(), "Too many exported symbols in JBIG2 symbol dictionary"); -+ delete symbolDict; -+ goto syntaxError; -+ } - if (ex) { - for (cnt = 0; cnt < run; ++cnt) { - symbolDict->setBitmap(j++, bitmaps[i++]->copy()); -@@ -1763,6 +1821,11 @@ - } - ex = !ex; - } -+ if (j != numExSyms) { -+ error(getPos(), "Too few symbols in JBIG2 symbol dictionary"); -+ delete symbolDict; -+ goto syntaxError; -+ } - - for (i = 0; i < numNewSyms; ++i) { - delete bitmaps[numInputSyms + i]; -@@ -1785,6 +1848,10 @@ - - return gTrue; - -+ codeTableError: -+ error(getPos(), "Missing code table in JBIG2 symbol dictionary"); -+ delete codeTables; -+ - syntaxError: - for (i = 0; i < numNewSyms; ++i) { - if (bitmaps[numInputSyms + i]) { -@@ -1887,6 +1954,8 @@ - } - } else { - error(getPos(), "Invalid segment reference in JBIG2 text region"); -+ delete codeTables; -+ return; - } - } - symCodeLen = 0; -@@ -1921,6 +1990,9 @@ - } else if (huffFS == 1) { - huffFSTable = huffTableG; - } else { -+ if (i >= (Guint)codeTables->getLength()) { -+ goto codeTableError; -+ } - huffFSTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); - } - if (huffDS == 0) { -@@ -1930,6 +2002,9 @@ - } else if (huffDS == 2) { - huffDSTable = huffTableJ; - } else { -+ if (i >= (Guint)codeTables->getLength()) { -+ goto codeTableError; -+ } - huffDSTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); - } - if (huffDT == 0) { -@@ -1939,6 +2014,9 @@ - } else if (huffDT == 2) { - huffDTTable = huffTableM; - } else { -+ if (i >= (Guint)codeTables->getLength()) { -+ goto codeTableError; -+ } - huffDTTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); - } - if (huffRDW == 0) { -@@ -1946,6 +2024,9 @@ - } else if (huffRDW == 1) { - huffRDWTable = huffTableO; - } else { -+ if (i >= (Guint)codeTables->getLength()) { -+ goto codeTableError; -+ } - huffRDWTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); - } - if (huffRDH == 0) { -@@ -1953,6 +2034,9 @@ - } else if (huffRDH == 1) { - huffRDHTable = huffTableO; - } else { -+ if (i >= (Guint)codeTables->getLength()) { -+ goto codeTableError; -+ } - huffRDHTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); - } - if (huffRDX == 0) { -@@ -1960,6 +2044,9 @@ - } else if (huffRDX == 1) { - huffRDXTable = huffTableO; - } else { -+ if (i >= (Guint)codeTables->getLength()) { -+ goto codeTableError; -+ } - huffRDXTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); - } - if (huffRDY == 0) { -@@ -1967,11 +2054,17 @@ - } else if (huffRDY == 1) { - huffRDYTable = huffTableO; - } else { -+ if (i >= (Guint)codeTables->getLength()) { -+ goto codeTableError; -+ } - huffRDYTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); - } - if (huffRSize == 0) { - huffRSizeTable = huffTableA; - } else { -+ if (i >= (Guint)codeTables->getLength()) { -+ goto codeTableError; -+ } - huffRSizeTable = - ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); - } -@@ -2066,8 +2159,15 @@ - - return; - -+ codeTableError: -+ error(getPos(), "Missing code table in JBIG2 text region"); -+ gfree(codeTables); -+ delete syms; -+ return; -+ - eofError: - error(getPos(), "Unexpected EOF in JBIG2 stream"); -+ return; - } - - JBIG2Bitmap *JBIG2Stream::readTextRegion(GBool huff, GBool refine, -@@ -2374,8 +2474,8 @@ - error(getPos(), "Bad symbol dictionary reference in JBIG2 halftone segment"); - return; - } -- seg = findSegment(refSegs[0]); -- if (seg->getType() != jbig2SegPatternDict) { -+ if (!(seg = findSegment(refSegs[0])) || -+ seg->getType() != jbig2SegPatternDict) { - error(getPos(), "Bad symbol dictionary reference in JBIG2 halftone segment"); - return; - } -@@ -2533,7 +2633,7 @@ - - // read the bitmap - bitmap = readGenericBitmap(mmr, w, h, templ, tpgdOn, gFalse, -- NULL, atx, aty, mmr ? 0 : length - 18); -+ NULL, atx, aty, mmr ? length - 18 : 0); - - // combine the region bitmap into the page bitmap - if (imm) { -@@ -2555,6 +2655,43 @@ - error(getPos(), "Unexpected EOF in JBIG2 stream"); - } - -+inline void JBIG2Stream::mmrAddPixels(int a1, int blackPixels, -+ int *codingLine, int *a0i, int w) { -+ if (a1 > codingLine[*a0i]) { -+ if (a1 > w) { -+ error(getPos(), "JBIG2 MMR row is wrong length ({0:d})", a1); -+ a1 = w; -+ } -+ if ((*a0i & 1) ^ blackPixels) { -+ ++*a0i; -+ } -+ codingLine[*a0i] = a1; -+ } -+} -+ -+inline void JBIG2Stream::mmrAddPixelsNeg(int a1, int blackPixels, -+ int *codingLine, int *a0i, int w) { -+ if (a1 > codingLine[*a0i]) { -+ if (a1 > w) { -+ error(getPos(), "JBIG2 MMR row is wrong length ({0:d})", a1); -+ a1 = w; -+ } -+ if ((*a0i & 1) ^ blackPixels) { -+ ++*a0i; -+ } -+ codingLine[*a0i] = a1; -+ } else if (a1 < codingLine[*a0i]) { -+ if (a1 < 0) { -+ error(getPos(), "Invalid JBIG2 MMR code"); -+ a1 = 0; -+ } -+ while (*a0i > 0 && a1 <= codingLine[*a0i - 1]) { -+ --*a0i; -+ } -+ codingLine[*a0i] = a1; -+ } -+} -+ - JBIG2Bitmap *JBIG2Stream::readGenericBitmap(GBool mmr, int w, int h, - int templ, GBool tpgdOn, - GBool useSkip, JBIG2Bitmap *skip, -@@ -2567,7 +2704,7 @@ - JBIG2BitmapPtr atPtr0, atPtr1, atPtr2, atPtr3; - int *refLine, *codingLine; - int code1, code2, code3; -- int x, y, a0, pix, i, refI, codingI; -+ int x, y, a0i, b1i, blackPixels, pix, i; - - bitmap = new JBIG2Bitmap(0, w, h); - bitmap->clearToZero(); -@@ -2577,9 +2714,18 @@ - if (mmr) { - - mmrDecoder->reset(); -+ if (w > INT_MAX - 2) { -+ error(getPos(), "Bad width in JBIG2 generic bitmap"); -+ // force a call to gmalloc(-1), which will throw an exception -+ w = -3; -+ } -+ // 0 <= codingLine[0] < codingLine[1] < ... < codingLine[n] = w -+ // ---> max codingLine size = w + 1 -+ // refLine has one extra guard entry at the end -+ // ---> max refLine size = w + 2 -+ codingLine = (int *)gmallocn(w + 1, sizeof(int)); - refLine = (int *)gmallocn(w + 2, sizeof(int)); -- codingLine = (int *)gmallocn(w + 2, sizeof(int)); -- codingLine[0] = codingLine[1] = w; -+ codingLine[0] = w; - - for (y = 0; y < h; ++y) { - -@@ -2587,128 +2733,157 @@ - for (i = 0; codingLine[i] < w; ++i) { - refLine[i] = codingLine[i]; - } -- refLine[i] = refLine[i + 1] = w; -+ refLine[i++] = w; -+ refLine[i] = w; - - // decode a line -- refI = 0; // b1 = refLine[refI] -- codingI = 0; // a1 = codingLine[codingI] -- a0 = 0; -- do { -+ codingLine[0] = 0; -+ a0i = 0; -+ b1i = 0; -+ blackPixels = 0; -+ // invariant: -+ // refLine[b1i-1] <= codingLine[a0i] < refLine[b1i] < refLine[b1i+1] <= w -+ // exception at left edge: -+ // codingLine[a0i = 0] = refLine[b1i = 0] = 0 is possible -+ // exception at right edge: -+ // refLine[b1i] = refLine[b1i+1] = w is possible -+ while (codingLine[a0i] < w) { - code1 = mmrDecoder->get2DCode(); - switch (code1) { - case twoDimPass: -- if (refLine[refI] < w) { -- a0 = refLine[refI + 1]; -- refI += 2; -- } -- break; -+ mmrAddPixels(refLine[b1i + 1], blackPixels, codingLine, &a0i, w); -+ if (refLine[b1i + 1] < w) { -+ b1i += 2; -+ } -+ break; - case twoDimHoriz: -- if (codingI & 1) { -- code1 = 0; -- do { -- code1 += code3 = mmrDecoder->getBlackCode(); -- } while (code3 >= 64); -- code2 = 0; -- do { -- code2 += code3 = mmrDecoder->getWhiteCode(); -- } while (code3 >= 64); -- } else { -- code1 = 0; -- do { -- code1 += code3 = mmrDecoder->getWhiteCode(); -- } while (code3 >= 64); -- code2 = 0; -- do { -- code2 += code3 = mmrDecoder->getBlackCode(); -- } while (code3 >= 64); -- } -- if (code1 > 0 || code2 > 0) { -- a0 = codingLine[codingI++] = a0 + code1; -- a0 = codingLine[codingI++] = a0 + code2; -- while (refLine[refI] <= a0 && refLine[refI] < w) { -- refI += 2; -- } -- } -- break; -+ code1 = code2 = 0; -+ if (blackPixels) { -+ do { -+ code1 += code3 = mmrDecoder->getBlackCode(); -+ } while (code3 >= 64); -+ do { -+ code2 += code3 = mmrDecoder->getWhiteCode(); -+ } while (code3 >= 64); -+ } else { -+ do { -+ code1 += code3 = mmrDecoder->getWhiteCode(); -+ } while (code3 >= 64); -+ do { -+ code2 += code3 = mmrDecoder->getBlackCode(); -+ } while (code3 >= 64); -+ } -+ mmrAddPixels(codingLine[a0i] + code1, blackPixels, -+ codingLine, &a0i, w); -+ if (codingLine[a0i] < w) { -+ mmrAddPixels(codingLine[a0i] + code2, blackPixels ^ 1, -+ codingLine, &a0i, w); -+ } -+ while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { -+ b1i += 2; -+ } -+ break; -+ case twoDimVertR3: -+ mmrAddPixels(refLine[b1i] + 3, blackPixels, codingLine, &a0i, w); -+ blackPixels ^= 1; -+ if (codingLine[a0i] < w) { -+ ++b1i; -+ while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { -+ b1i += 2; -+ } -+ } -+ break; -+ case twoDimVertR2: -+ mmrAddPixels(refLine[b1i] + 2, blackPixels, codingLine, &a0i, w); -+ blackPixels ^= 1; -+ if (codingLine[a0i] < w) { -+ ++b1i; -+ while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { -+ b1i += 2; -+ } -+ } -+ break; -+ case twoDimVertR1: -+ mmrAddPixels(refLine[b1i] + 1, blackPixels, codingLine, &a0i, w); -+ blackPixels ^= 1; -+ if (codingLine[a0i] < w) { -+ ++b1i; -+ while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { -+ b1i += 2; -+ } -+ } -+ break; - case twoDimVert0: -- a0 = codingLine[codingI++] = refLine[refI]; -- if (refLine[refI] < w) { -- ++refI; -- } -- break; -- case twoDimVertR1: -- a0 = codingLine[codingI++] = refLine[refI] + 1; -- if (refLine[refI] < w) { -- ++refI; -- while (refLine[refI] <= a0 && refLine[refI] < w) { -- refI += 2; -- } -- } -- break; -- case twoDimVertR2: -- a0 = codingLine[codingI++] = refLine[refI] + 2; -- if (refLine[refI] < w) { -- ++refI; -- while (refLine[refI] <= a0 && refLine[refI] < w) { -- refI += 2; -- } -- } -- break; -- case twoDimVertR3: -- a0 = codingLine[codingI++] = refLine[refI] + 3; -- if (refLine[refI] < w) { -- ++refI; -- while (refLine[refI] <= a0 && refLine[refI] < w) { -- refI += 2; -- } -- } -- break; -+ mmrAddPixels(refLine[b1i], blackPixels, codingLine, &a0i, w); -+ blackPixels ^= 1; -+ if (codingLine[a0i] < w) { -+ ++b1i; -+ while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { -+ b1i += 2; -+ } -+ } -+ break; -+ case twoDimVertL3: -+ mmrAddPixelsNeg(refLine[b1i] - 3, blackPixels, codingLine, &a0i, w); -+ blackPixels ^= 1; -+ if (codingLine[a0i] < w) { -+ if (b1i > 0) { -+ --b1i; -+ } else { -+ ++b1i; -+ } -+ while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { -+ b1i += 2; -+ } -+ } -+ break; -+ case twoDimVertL2: -+ mmrAddPixelsNeg(refLine[b1i] - 2, blackPixels, codingLine, &a0i, w); -+ blackPixels ^= 1; -+ if (codingLine[a0i] < w) { -+ if (b1i > 0) { -+ --b1i; -+ } else { -+ ++b1i; -+ } -+ while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { -+ b1i += 2; -+ } -+ } -+ break; - case twoDimVertL1: -- a0 = codingLine[codingI++] = refLine[refI] - 1; -- if (refI > 0) { -- --refI; -- } else { -- ++refI; -- } -- while (refLine[refI] <= a0 && refLine[refI] < w) { -- refI += 2; -- } -- break; -- case twoDimVertL2: -- a0 = codingLine[codingI++] = refLine[refI] - 2; -- if (refI > 0) { -- --refI; -- } else { -- ++refI; -- } -- while (refLine[refI] <= a0 && refLine[refI] < w) { -- refI += 2; -- } -- break; -- case twoDimVertL3: -- a0 = codingLine[codingI++] = refLine[refI] - 3; -- if (refI > 0) { -- --refI; -- } else { -- ++refI; -- } -- while (refLine[refI] <= a0 && refLine[refI] < w) { -- refI += 2; -- } -- break; -+ mmrAddPixelsNeg(refLine[b1i] - 1, blackPixels, codingLine, &a0i, w); -+ blackPixels ^= 1; -+ if (codingLine[a0i] < w) { -+ if (b1i > 0) { -+ --b1i; -+ } else { -+ ++b1i; -+ } -+ while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { -+ b1i += 2; -+ } -+ } -+ break; -+ case EOF: -+ mmrAddPixels(w, 0, codingLine, &a0i, w); -+ break; - default: - error(getPos(), "Illegal code in JBIG2 MMR bitmap data"); -+ mmrAddPixels(w, 0, codingLine, &a0i, w); - break; - } -- } while (a0 < w); -- codingLine[codingI++] = w; -+ } - - // convert the run lengths to a bitmap line - i = 0; -- while (codingLine[i] < w) { -+ while (1) { - for (x = codingLine[i]; x < codingLine[i+1]; ++x) { - bitmap->setPixel(x, y); - } -+ if (codingLine[i+1] >= w || codingLine[i+2] >= w) { -+ break; -+ } - i += 2; - } - } -@@ -2756,7 +2931,9 @@ - ltp = !ltp; - } - if (ltp) { -- bitmap->duplicateRow(y, y-1); -+ if (y > 0) { -+ bitmap->duplicateRow(y, y-1); -+ } - continue; - } - } -@@ -2959,8 +3136,8 @@ - return; - } - if (nRefSegs == 1) { -- seg = findSegment(refSegs[0]); -- if (seg->getType() != jbig2SegBitmap) { -+ if (!(seg = findSegment(refSegs[0])) || -+ seg->getType() != jbig2SegBitmap) { - error(getPos(), "Bad bitmap reference in JBIG2 generic refinement segment"); - return; - } -@@ -3054,6 +3231,10 @@ - tpgrCX2 = refBitmap->nextPixel(&tpgrCXPtr2); - tpgrCX2 = (tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2); - tpgrCX2 = (tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2); -+ } else { -+ tpgrCXPtr0.p = tpgrCXPtr1.p = tpgrCXPtr2.p = NULL; // make gcc happy -+ tpgrCXPtr0.shift = tpgrCXPtr1.shift = tpgrCXPtr2.shift = 0; -+ tpgrCXPtr0.x = tpgrCXPtr1.x = tpgrCXPtr2.x = 0; - } - - for (x = 0; x < w; ++x) { -@@ -3125,6 +3306,10 @@ - tpgrCX2 = refBitmap->nextPixel(&tpgrCXPtr2); - tpgrCX2 = (tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2); - tpgrCX2 = (tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2); -+ } else { -+ tpgrCXPtr0.p = tpgrCXPtr1.p = tpgrCXPtr2.p = NULL; // make gcc happy -+ tpgrCXPtr0.shift = tpgrCXPtr1.shift = tpgrCXPtr2.shift = 0; -+ tpgrCXPtr0.x = tpgrCXPtr1.x = tpgrCXPtr2.x = 0; - } - - for (x = 0; x < w; ++x) { -Index: xpdf/xpdf/JBIG2Stream.h -=================================================================== ---- kdegraphics/kpdf/xpdf/xpdf/JBIG2Stream.h (.../tags/KDE/3.5.10) (revision 850549) -+++ kdegraphics/kpdf/xpdf/xpdf/JBIG2Stream.h (.../branches/KDE/3.5) (revision 983313) -@@ -78,6 +78,10 @@ - Guint *refSegs, Guint nRefSegs); - void readGenericRegionSeg(Guint segNum, GBool imm, - GBool lossless, Guint length); -+ void mmrAddPixels(int a1, int blackPixels, -+ int *codingLine, int *a0i, int w); -+ void mmrAddPixelsNeg(int a1, int blackPixels, -+ int *codingLine, int *a0i, int w); - JBIG2Bitmap *readGenericBitmap(GBool mmr, int w, int h, - int templ, GBool tpgdOn, - GBool useSkip, JBIG2Bitmap *skip, -Index: xpdf/goo/gmem.cc -=================================================================== ---- kdegraphics/kpdf/xpdf/goo/gmem.cc (.../tags/KDE/3.5.10) (revision 850549) -+++ kdegraphics/kpdf/xpdf/goo/gmem.cc (.../branches/KDE/3.5) (revision 983313) -@@ -55,7 +55,15 @@ - void *data; - unsigned long *trl, *p; - -- if (size <= 0) { -+ if (size < 0) { -+#if USE_EXCEPTIONS -+ throw GMemException(); -+#else -+ fprintf(stderr, "Invalid memory allocation size\n"); -+ exit(1); -+#endif -+ } -+ if (size == 0) { - return NULL; - } - size1 = gMemDataSize(size); -@@ -91,7 +99,15 @@ - #else - void *p; - -- if (size <= 0) { -+ if (size < 0) { -+#if USE_EXCEPTIONS -+ throw GMemException(); -+#else -+ fprintf(stderr, "Invalid memory allocation size\n"); -+ exit(1); -+#endif -+ } -+ if (size == 0) { - return NULL; - } - if (!(p = malloc(size))) { -@@ -112,7 +128,15 @@ - void *q; - int oldSize; - -- if (size <= 0) { -+ if (size < 0) { -+#if USE_EXCEPTIONS -+ throw GMemException(); -+#else -+ fprintf(stderr, "Invalid memory allocation size\n"); -+ exit(1); -+#endif -+ } -+ if (size == 0) { - if (p) { - gfree(p); - } -@@ -131,7 +155,15 @@ - #else - void *q; - -- if (size <= 0) { -+ if (size < 0) { -+#if USE_EXCEPTIONS -+ throw GMemException(); -+#else -+ fprintf(stderr, "Invalid memory allocation size\n"); -+ exit(1); -+#endif -+ } -+ if (size == 0) { - if (p) { - free(p); - } |