#include <tiffio.h>
#include "openjpeg.h"
#include "convert.h"
+#include "opj_inttypes.h"
/* -->> -->> -->> -->>
tdata_t buf;
uint32 width, height, bps, tiPhoto;
int adjust, sgnd;
- tmsize_t strip_size, rowStride;
+ int64_t strip_size, rowStride, TIFF_MAX;
OPJ_UINT32 i, numcomps;
OPJ_INT32* buffer32s = NULL;
OPJ_INT32 const* planes[4];
TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, tiPhoto);
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");
TIFFClose(tif);
return 1;
}
-
- strip_size = TIFFStripSize(tif);
- rowStride = (width * numcomps * bps + 7U) / 8U;
+ rowStride = (int64_t)((width * numcomps * bps + 7U) / 8U);
if (rowStride != strip_size) {
fprintf(stderr, "Invalid TIFF strip size\n");
TIFFClose(tif);
return 1;
}
- buf = _TIFFmalloc(strip_size);
+ buf = malloc((OPJ_SIZE_T)strip_size);
if (buf == NULL) {
TIFFClose(tif);
return 1;
}
-
- buffer32s = (OPJ_INT32 *)malloc((OPJ_SIZE_T)(width * numcomps * sizeof(OPJ_INT32)));
-
+ buffer32s = (OPJ_INT32 *)malloc((OPJ_SIZE_T)(width * numcomps * sizeof(
+ OPJ_INT32)));
if (buffer32s == NULL) {
_TIFFfree(buf);
TIFFClose(tif);
for (i = 0; i < image->comps[0].h; ++i) {
cvtPxToCx(planes, buffer32s, (OPJ_SIZE_T)width, adjust);
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[1] += width;
planes[2] += width;
TIFF *tif;
tdata_t buf;
tstrip_t strip;
- tmsize_t strip_size;
+ int64_t strip_size, rowStride, TIFF_MAX;
int j, currentPlane, numcomps = 0, w, h;
OPJ_COLOR_SPACE color_space = OPJ_CLRSPC_UNKNOWN;
opj_image_cmptparm_t cmptparm[4]; /* RGBA */
convert_32s_CXPX cvtCxToPx = NULL;
OPJ_INT32* buffer32s = NULL;
OPJ_INT32* planes[4];
- tmsize_t rowStride;
-
+
tif = TIFFOpen(filename, "r");
if (!tif) {
}
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) {
TIFFClose(tif);
opj_image_destroy(image);
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");
_TIFFfree(buf);
TIFFClose(tif);
opj_image_destroy(image);
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(
OPJ_INT32)));
if (buffer32s == NULL) {
/* Read the Image components */
for (; (h > 0) && (strip < TIFFNumberOfStrips(tif)); strip++) {
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) {
- fprintf(stderr, "tiftoimage: Bad value for ssize(%ld) "
- "vs. strip_size(%ld).\n\tAborting.\n", ssize, strip_size);
+ fprintf(stderr, "tiftoimage: Bad value for ssize(%" PRId64 ") "
+ "vs. strip_size(%" PRId64 ").\n\tAborting.\n", ssize, strip_size);
_TIFFfree(buf);
_TIFFfree(buffer32s);
TIFFClose(tif);