Lines 15-20
Link Here
|
15 |
#include <stdio.h> |
15 |
#include <stdio.h> |
16 |
#include <stdlib.h> |
16 |
#include <stdlib.h> |
17 |
#include <stddef.h> |
17 |
#include <stddef.h> |
|
|
18 |
#include <limits.h> |
18 |
#ifndef WIN32 |
19 |
#ifndef WIN32 |
19 |
#include <unistd.h> |
20 |
#include <unistd.h> |
20 |
#endif |
21 |
#endif |
Lines 401-418
Link Here
|
401 |
|
402 |
|
402 |
StreamPredictor::StreamPredictor(Stream *strA, int predictorA, |
403 |
StreamPredictor::StreamPredictor(Stream *strA, int predictorA, |
403 |
int widthA, int nCompsA, int nBitsA) { |
404 |
int widthA, int nCompsA, int nBitsA) { |
|
|
405 |
int totalBits; |
406 |
|
404 |
str = strA; |
407 |
str = strA; |
405 |
predictor = predictorA; |
408 |
predictor = predictorA; |
406 |
width = widthA; |
409 |
width = widthA; |
407 |
nComps = nCompsA; |
410 |
nComps = nCompsA; |
408 |
nBits = nBitsA; |
411 |
nBits = nBitsA; |
|
|
412 |
predLine = NULL; |
413 |
ok = gFalse; |
409 |
|
414 |
|
410 |
nVals = width * nComps; |
415 |
nVals = width * nComps; |
|
|
416 |
totalBits = nVals * nBits; |
417 |
if (width <= 0 || nComps <= 0 || nBits <= 0 || |
418 |
nComps >= INT_MAX / nBits || |
419 |
width >= INT_MAX / nComps / nBits || |
420 |
nVals * nBits + 7 < 0) { |
421 |
return; |
422 |
} |
411 |
pixBytes = (nComps * nBits + 7) >> 3; |
423 |
pixBytes = (nComps * nBits + 7) >> 3; |
412 |
rowBytes = ((nVals * nBits + 7) >> 3) + pixBytes; |
424 |
rowBytes = ((totalBits + 7) >> 3) + pixBytes; |
|
|
425 |
if (rowBytes < 0) { |
426 |
return; |
427 |
} |
413 |
predLine = (Guchar *)gmalloc(rowBytes); |
428 |
predLine = (Guchar *)gmalloc(rowBytes); |
414 |
memset(predLine, 0, rowBytes); |
429 |
memset(predLine, 0, rowBytes); |
415 |
predIdx = rowBytes; |
430 |
predIdx = rowBytes; |
|
|
431 |
|
432 |
ok = gTrue; |
416 |
} |
433 |
} |
417 |
|
434 |
|
418 |
StreamPredictor::~StreamPredictor() { |
435 |
StreamPredictor::~StreamPredictor() { |
Lines 1004-1009
Link Here
|
1004 |
FilterStream(strA) { |
1021 |
FilterStream(strA) { |
1005 |
if (predictor != 1) { |
1022 |
if (predictor != 1) { |
1006 |
pred = new StreamPredictor(this, predictor, columns, colors, bits); |
1023 |
pred = new StreamPredictor(this, predictor, columns, colors, bits); |
|
|
1024 |
if (!pred->isOk()) { |
1025 |
delete pred; |
1026 |
pred = NULL; |
1027 |
} |
1007 |
} else { |
1028 |
} else { |
1008 |
pred = NULL; |
1029 |
pred = NULL; |
1009 |
} |
1030 |
} |
Lines 1259-1264
Link Here
|
1259 |
if (columns < 1) { |
1280 |
if (columns < 1) { |
1260 |
columns = 1; |
1281 |
columns = 1; |
1261 |
} |
1282 |
} |
|
|
1283 |
if (columns + 4 <= 0) { |
1284 |
columns = INT_MAX - 4; |
1285 |
} |
1262 |
rows = rowsA; |
1286 |
rows = rowsA; |
1263 |
endOfBlock = endOfBlockA; |
1287 |
endOfBlock = endOfBlockA; |
1264 |
black = blackA; |
1288 |
black = blackA; |
Lines 2899-2904
Link Here
|
2899 |
height = read16(); |
2923 |
height = read16(); |
2900 |
width = read16(); |
2924 |
width = read16(); |
2901 |
numComps = str->getChar(); |
2925 |
numComps = str->getChar(); |
|
|
2926 |
if (numComps <= 0 || numComps > 4) { |
2927 |
error(getPos(), "Bad number of components in DCT stream", prec); |
2928 |
return gFalse; |
2929 |
} |
2930 |
if (numComps <= 0 || numComps > 4) { |
2931 |
error(getPos(), "Bad number of components in DCT stream", prec); |
2932 |
return gFalse; |
2933 |
} |
2902 |
if (prec != 8) { |
2934 |
if (prec != 8) { |
2903 |
error(getPos(), "Bad DCT precision %d", prec); |
2935 |
error(getPos(), "Bad DCT precision %d", prec); |
2904 |
return gFalse; |
2936 |
return gFalse; |
Lines 2925-2930
Link Here
|
2925 |
height = read16(); |
2957 |
height = read16(); |
2926 |
width = read16(); |
2958 |
width = read16(); |
2927 |
numComps = str->getChar(); |
2959 |
numComps = str->getChar(); |
|
|
2960 |
if (numComps <= 0 || numComps > 4) { |
2961 |
error(getPos(), "Bad number of components in DCT stream"); |
2962 |
numComps = 0; |
2963 |
return gFalse; |
2964 |
} |
2965 |
if (numComps <= 0 || numComps > 4) { |
2966 |
error(getPos(), "Bad number of components in DCT stream"); |
2967 |
numComps = 0; |
2968 |
return gFalse; |
2969 |
} |
2928 |
if (prec != 8) { |
2970 |
if (prec != 8) { |
2929 |
error(getPos(), "Bad DCT precision %d", prec); |
2971 |
error(getPos(), "Bad DCT precision %d", prec); |
2930 |
return gFalse; |
2972 |
return gFalse; |
Lines 2947-2952
Link Here
|
2947 |
|
2989 |
|
2948 |
length = read16() - 2; |
2990 |
length = read16() - 2; |
2949 |
scanInfo.numComps = str->getChar(); |
2991 |
scanInfo.numComps = str->getChar(); |
|
|
2992 |
if (scanInfo.numComps <= 0 || scanInfo.numComps > 4) { |
2993 |
error(getPos(), "Bad number of components in DCT stream"); |
2994 |
scanInfo.numComps = 0; |
2995 |
return gFalse; |
2996 |
} |
2950 |
--length; |
2997 |
--length; |
2951 |
if (length != 2 * scanInfo.numComps + 3) { |
2998 |
if (length != 2 * scanInfo.numComps + 3) { |
2952 |
error(getPos(), "Bad DCT scan info block"); |
2999 |
error(getPos(), "Bad DCT scan info block"); |
Lines 3041-3046
Link Here
|
3041 |
numACHuffTables = index+1; |
3088 |
numACHuffTables = index+1; |
3042 |
tbl = &acHuffTables[index]; |
3089 |
tbl = &acHuffTables[index]; |
3043 |
} else { |
3090 |
} else { |
|
|
3091 |
index &= 0x0f; |
3044 |
if (index >= numDCHuffTables) |
3092 |
if (index >= numDCHuffTables) |
3045 |
numDCHuffTables = index+1; |
3093 |
numDCHuffTables = index+1; |
3046 |
tbl = &dcHuffTables[index]; |
3094 |
tbl = &dcHuffTables[index]; |
Lines 3827-3832
Link Here
|
3827 |
FilterStream(strA) { |
3875 |
FilterStream(strA) { |
3828 |
if (predictor != 1) { |
3876 |
if (predictor != 1) { |
3829 |
pred = new StreamPredictor(this, predictor, columns, colors, bits); |
3877 |
pred = new StreamPredictor(this, predictor, columns, colors, bits); |
|
|
3878 |
if (!pred->isOk()) { |
3879 |
delete pred; |
3880 |
pred = NULL; |
3881 |
} |
3830 |
} else { |
3882 |
} else { |
3831 |
pred = NULL; |
3883 |
pred = NULL; |
3832 |
} |
3884 |
} |