Changes for converttif.c to fix tsize_t
This commit is contained in:
parent
57e36dbfeb
commit
bc3cb74100
|
@ -51,6 +51,7 @@
|
||||||
#include <tiffio.h>
|
#include <tiffio.h>
|
||||||
#include "openjpeg.h"
|
#include "openjpeg.h"
|
||||||
#include "convert.h"
|
#include "convert.h"
|
||||||
|
#include "opj_inttypes.h"
|
||||||
|
|
||||||
/* -->> -->> -->> -->>
|
/* -->> -->> -->> -->>
|
||||||
|
|
||||||
|
@ -569,7 +570,7 @@ int imagetotif(opj_image_t * image, const char *outfile)
|
||||||
tdata_t buf;
|
tdata_t buf;
|
||||||
uint32 width, height, bps, tiPhoto;
|
uint32 width, height, bps, tiPhoto;
|
||||||
int adjust, sgnd;
|
int adjust, sgnd;
|
||||||
tmsize_t strip_size, rowStride;
|
int64_t strip_size, rowStride, TIFF_MAX;
|
||||||
OPJ_UINT32 i, numcomps;
|
OPJ_UINT32 i, numcomps;
|
||||||
OPJ_INT32* buffer32s = NULL;
|
OPJ_INT32* buffer32s = NULL;
|
||||||
OPJ_INT32 const* planes[4];
|
OPJ_INT32 const* planes[4];
|
||||||
|
@ -697,28 +698,34 @@ int imagetotif(opj_image_t * image, const char *outfile)
|
||||||
TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
|
TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
|
||||||
TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, tiPhoto);
|
TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, tiPhoto);
|
||||||
TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1);
|
TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1);
|
||||||
|
if (sizeof(tsize_t) == 4) {
|
||||||
|
TIFF_MAX = INT_MAX;
|
||||||
|
} else {
|
||||||
|
TIFF_MAX = UINT_MAX;
|
||||||
|
}
|
||||||
|
strip_size = (int64_t)TIFFStripSize(tif);
|
||||||
|
|
||||||
if (width > UINT_MAX/numcomps || width * bps > UINT_MAX/numcomps || width * numcomps > UINT_MAX/sizeof(OPJ_INT32)) {
|
if ((int64_t)width > (int64_t)(TIFF_MAX / numcomps) ||
|
||||||
|
(int64_t)(width * numcomps) > (int64_t)(TIFF_MAX / bps) ||
|
||||||
|
(int64_t)(width * numcomps) > (int64_t)(TIFF_MAX / (int64_t)sizeof(
|
||||||
|
OPJ_INT32))) {
|
||||||
fprintf(stderr, "Buffer overflow\n");
|
fprintf(stderr, "Buffer overflow\n");
|
||||||
TIFFClose(tif);
|
TIFFClose(tif);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
rowStride = (int64_t)((width * numcomps * bps + 7U) / 8U);
|
||||||
strip_size = TIFFStripSize(tif);
|
|
||||||
rowStride = (width * numcomps * bps + 7U) / 8U;
|
|
||||||
if (rowStride != strip_size) {
|
if (rowStride != strip_size) {
|
||||||
fprintf(stderr, "Invalid TIFF strip size\n");
|
fprintf(stderr, "Invalid TIFF strip size\n");
|
||||||
TIFFClose(tif);
|
TIFFClose(tif);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
buf = _TIFFmalloc(strip_size);
|
buf = malloc((OPJ_SIZE_T)strip_size);
|
||||||
if (buf == NULL) {
|
if (buf == NULL) {
|
||||||
TIFFClose(tif);
|
TIFFClose(tif);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
buffer32s = (OPJ_INT32 *)malloc((OPJ_SIZE_T)(width * numcomps * sizeof(
|
||||||
buffer32s = (OPJ_INT32 *)malloc((OPJ_SIZE_T)(width * numcomps * sizeof(OPJ_INT32)));
|
OPJ_INT32)));
|
||||||
|
|
||||||
if (buffer32s == NULL) {
|
if (buffer32s == NULL) {
|
||||||
_TIFFfree(buf);
|
_TIFFfree(buf);
|
||||||
TIFFClose(tif);
|
TIFFClose(tif);
|
||||||
|
@ -728,7 +735,7 @@ int imagetotif(opj_image_t * image, const char *outfile)
|
||||||
for (i = 0; i < image->comps[0].h; ++i) {
|
for (i = 0; i < image->comps[0].h; ++i) {
|
||||||
cvtPxToCx(planes, buffer32s, (OPJ_SIZE_T)width, adjust);
|
cvtPxToCx(planes, buffer32s, (OPJ_SIZE_T)width, adjust);
|
||||||
cvt32sToTif(buffer32s, (OPJ_BYTE *)buf, (OPJ_SIZE_T)width * numcomps);
|
cvt32sToTif(buffer32s, (OPJ_BYTE *)buf, (OPJ_SIZE_T)width * numcomps);
|
||||||
(void)TIFFWriteEncodedStrip(tif, i, (void*)buf, strip_size);
|
(void)TIFFWriteEncodedStrip(tif, i, (void*)buf, (tsize_t)strip_size);
|
||||||
planes[0] += width;
|
planes[0] += width;
|
||||||
planes[1] += width;
|
planes[1] += width;
|
||||||
planes[2] += width;
|
planes[2] += width;
|
||||||
|
@ -1241,7 +1248,7 @@ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters)
|
||||||
TIFF *tif;
|
TIFF *tif;
|
||||||
tdata_t buf;
|
tdata_t buf;
|
||||||
tstrip_t strip;
|
tstrip_t strip;
|
||||||
tmsize_t strip_size;
|
int64_t strip_size, rowStride, TIFF_MAX;
|
||||||
int j, currentPlane, numcomps = 0, w, h;
|
int j, currentPlane, numcomps = 0, w, h;
|
||||||
OPJ_COLOR_SPACE color_space = OPJ_CLRSPC_UNKNOWN;
|
OPJ_COLOR_SPACE color_space = OPJ_CLRSPC_UNKNOWN;
|
||||||
opj_image_cmptparm_t cmptparm[4]; /* RGBA */
|
opj_image_cmptparm_t cmptparm[4]; /* RGBA */
|
||||||
|
@ -1253,8 +1260,7 @@ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters)
|
||||||
convert_32s_CXPX cvtCxToPx = NULL;
|
convert_32s_CXPX cvtCxToPx = NULL;
|
||||||
OPJ_INT32* buffer32s = NULL;
|
OPJ_INT32* buffer32s = NULL;
|
||||||
OPJ_INT32* planes[4];
|
OPJ_INT32* planes[4];
|
||||||
tmsize_t rowStride;
|
|
||||||
|
|
||||||
tif = TIFFOpen(filename, "r");
|
tif = TIFFOpen(filename, "r");
|
||||||
|
|
||||||
if (!tif) {
|
if (!tif) {
|
||||||
|
@ -1445,22 +1451,30 @@ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters)
|
||||||
}
|
}
|
||||||
image->comps[numcomps - 1].alpha = (OPJ_UINT16)(1 - (numcomps & 1));
|
image->comps[numcomps - 1].alpha = (OPJ_UINT16)(1 - (numcomps & 1));
|
||||||
|
|
||||||
strip_size = TIFFStripSize(tif);
|
strip_size = (int64_t)TIFFStripSize(tif);
|
||||||
|
|
||||||
buf = _TIFFmalloc(strip_size);
|
buf = malloc((OPJ_SIZE_T)strip_size);
|
||||||
if (buf == NULL) {
|
if (buf == NULL) {
|
||||||
TIFFClose(tif);
|
TIFFClose(tif);
|
||||||
opj_image_destroy(image);
|
opj_image_destroy(image);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (tiWidth > UINT_MAX/tiSpp || tiWidth * tiSpp > UINT_MAX/tiBps || tiWidth * tiSpp > UINT_MAX/sizeof(OPJ_INT32)) {
|
if (sizeof(tsize_t) == 4) {
|
||||||
|
TIFF_MAX = INT_MAX;
|
||||||
|
} else {
|
||||||
|
TIFF_MAX = UINT_MAX;
|
||||||
|
}
|
||||||
|
if ((int64_t)tiWidth > (int64_t)(TIFF_MAX / tiSpp) ||
|
||||||
|
(int64_t)(tiWidth * tiSpp) > (int64_t)(TIFF_MAX / tiBps) ||
|
||||||
|
(int64_t)(tiWidth * tiSpp) > (int64_t)(TIFF_MAX / (int64_t)sizeof(OPJ_INT32))) {
|
||||||
fprintf(stderr, "Buffer overflow\n");
|
fprintf(stderr, "Buffer overflow\n");
|
||||||
_TIFFfree(buf);
|
_TIFFfree(buf);
|
||||||
TIFFClose(tif);
|
TIFFClose(tif);
|
||||||
opj_image_destroy(image);
|
opj_image_destroy(image);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
rowStride = (tmsize_t)((tiWidth * tiSpp * tiBps + 7U) / 8U);
|
|
||||||
|
rowStride = (int64_t)((tiWidth * tiSpp * tiBps + 7U) / 8U);
|
||||||
buffer32s = (OPJ_INT32 *)malloc((OPJ_SIZE_T)(tiWidth * tiSpp * sizeof(
|
buffer32s = (OPJ_INT32 *)malloc((OPJ_SIZE_T)(tiWidth * tiSpp * sizeof(
|
||||||
OPJ_INT32)));
|
OPJ_INT32)));
|
||||||
if (buffer32s == NULL) {
|
if (buffer32s == NULL) {
|
||||||
|
@ -1478,13 +1492,13 @@ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters)
|
||||||
/* Read the Image components */
|
/* Read the Image components */
|
||||||
for (; (h > 0) && (strip < TIFFNumberOfStrips(tif)); strip++) {
|
for (; (h > 0) && (strip < TIFFNumberOfStrips(tif)); strip++) {
|
||||||
const OPJ_UINT8 *dat8;
|
const OPJ_UINT8 *dat8;
|
||||||
tmsize_t ssize;
|
int64_t ssize;
|
||||||
|
|
||||||
ssize = TIFFReadEncodedStrip(tif, strip, buf, strip_size);
|
ssize = (int64_t)TIFFReadEncodedStrip(tif, strip, buf, (tsize_t)strip_size);
|
||||||
|
|
||||||
if (ssize < 1 || ssize > strip_size) {
|
if (ssize < 1 || ssize > strip_size) {
|
||||||
fprintf(stderr, "tiftoimage: Bad value for ssize(%ld) "
|
fprintf(stderr, "tiftoimage: Bad value for ssize(%" PRId64 ") "
|
||||||
"vs. strip_size(%ld).\n\tAborting.\n", ssize, strip_size);
|
"vs. strip_size(%" PRId64 ").\n\tAborting.\n", ssize, strip_size);
|
||||||
_TIFFfree(buf);
|
_TIFFfree(buf);
|
||||||
_TIFFfree(buffer32s);
|
_TIFFfree(buffer32s);
|
||||||
TIFFClose(tif);
|
TIFFClose(tif);
|
||||||
|
|
Loading…
Reference in New Issue