OPJ_UINT32 width, height;
OPJ_UINT32 x, y;
const OPJ_UINT8 *pSrc = NULL;
- OPJ_BOOL hasAlpha = OPJ_FALSE;
+ OPJ_BOOL hasAlpha;
OPJ_UINT32 redShift, redPrec;
OPJ_UINT32 greenShift, greenPrec;
OPJ_UINT32 blueShift, bluePrec;
OPJ_UINT32 width, height;
OPJ_UINT32 x, y;
const OPJ_UINT8 *pSrc = NULL;
- OPJ_BOOL hasAlpha = OPJ_FALSE;
+ OPJ_BOOL hasAlpha;
OPJ_UINT32 redShift, redPrec;
OPJ_UINT32 greenShift, greenPrec;
OPJ_UINT32 blueShift, bluePrec;
static OPJ_BOOL bmp_read_file_header(FILE* IN, OPJ_BITMAPFILEHEADER* header)
{
header->bfType = (OPJ_UINT16)getc(IN);
- header->bfType |= (OPJ_UINT16)((OPJ_UINT32)(getc(IN) << 8));
+ header->bfType |= (OPJ_UINT16)((OPJ_UINT32)getc(IN) << 8);
if (header->bfType != 19778) {
fprintf(stderr,"Error, not a BMP file!\n");
/* FILE HEADER */
/* ------------- */
header->bfSize = (OPJ_UINT32)getc(IN);
- header->bfSize |= (OPJ_UINT32)(getc(IN) << 8);
- header->bfSize |= (OPJ_UINT32)(getc(IN) << 16);
- header->bfSize |= (OPJ_UINT32)(getc(IN) << 24);
+ header->bfSize |= (OPJ_UINT32)getc(IN) << 8;
+ header->bfSize |= (OPJ_UINT32)getc(IN) << 16;
+ header->bfSize |= (OPJ_UINT32)getc(IN) << 24;
header->bfReserved1 = (OPJ_UINT16)getc(IN);
- header->bfReserved1 |= (OPJ_UINT16)((OPJ_UINT32)(getc(IN) << 8));
+ header->bfReserved1 |= (OPJ_UINT16)((OPJ_UINT32)getc(IN) << 8);
header->bfReserved2 = (OPJ_UINT16)getc(IN);
- header->bfReserved2 |= (OPJ_UINT16)((OPJ_UINT32)(getc(IN) << 8));
+ header->bfReserved2 |= (OPJ_UINT16)((OPJ_UINT32)getc(IN) << 8);
header->bfOffBits = (OPJ_UINT32)getc(IN);
- header->bfOffBits |= (OPJ_UINT32)(getc(IN) << 8);
- header->bfOffBits |= (OPJ_UINT32)(getc(IN) << 16);
- header->bfOffBits |= (OPJ_UINT32)(getc(IN) << 24);
+ header->bfOffBits |= (OPJ_UINT32)getc(IN) << 8;
+ header->bfOffBits |= (OPJ_UINT32)getc(IN) << 16;
+ header->bfOffBits |= (OPJ_UINT32)getc(IN) << 24;
return OPJ_TRUE;
}
static OPJ_BOOL bmp_read_info_header(FILE* IN, OPJ_BITMAPINFOHEADER* header)
/* INFO HEADER */
/* ------------- */
header->biSize = (OPJ_UINT32)getc(IN);
- header->biSize |= (OPJ_UINT32)(getc(IN) << 8);
- header->biSize |= (OPJ_UINT32)(getc(IN) << 16);
- header->biSize |= (OPJ_UINT32)(getc(IN) << 24);
+ header->biSize |= (OPJ_UINT32)getc(IN) << 8;
+ header->biSize |= (OPJ_UINT32)getc(IN) << 16;
+ header->biSize |= (OPJ_UINT32)getc(IN) << 24;
switch (header->biSize) {
case 12U: /* BITMAPCOREHEADER */
}
header->biWidth = (OPJ_UINT32)getc(IN);
- header->biWidth |= (OPJ_UINT32)(getc(IN) << 8);
- header->biWidth |= (OPJ_UINT32)(getc(IN) << 16);
- header->biWidth |= (OPJ_UINT32)(getc(IN) << 24);
+ header->biWidth |= (OPJ_UINT32)getc(IN) << 8;
+ header->biWidth |= (OPJ_UINT32)getc(IN) << 16;
+ header->biWidth |= (OPJ_UINT32)getc(IN) << 24;
header->biHeight = (OPJ_UINT32)getc(IN);
- header->biHeight |= (OPJ_UINT32)(getc(IN) << 8);
- header->biHeight |= (OPJ_UINT32)(getc(IN) << 16);
- header->biHeight |= (OPJ_UINT32)(getc(IN) << 24);
+ header->biHeight |= (OPJ_UINT32)getc(IN) << 8;
+ header->biHeight |= (OPJ_UINT32)getc(IN) << 16;
+ header->biHeight |= (OPJ_UINT32)getc(IN) << 24;
header->biPlanes = (OPJ_UINT16)getc(IN);
- header->biPlanes |= (OPJ_UINT16)((OPJ_UINT32)(getc(IN) << 8));
+ header->biPlanes |= (OPJ_UINT16)((OPJ_UINT32)getc(IN) << 8);
header->biBitCount = (OPJ_UINT16)getc(IN);
- header->biBitCount |= (OPJ_UINT16)((OPJ_UINT32)(getc(IN) << 8));
+ header->biBitCount |= (OPJ_UINT16)((OPJ_UINT32)getc(IN) << 8);
if(header->biSize >= 40U) {
header->biCompression = (OPJ_UINT32)getc(IN);
- header->biCompression |= (OPJ_UINT32)(getc(IN) << 8);
- header->biCompression |= (OPJ_UINT32)(getc(IN) << 16);
- header->biCompression |= (OPJ_UINT32)(getc(IN) << 24);
+ header->biCompression |= (OPJ_UINT32)getc(IN) << 8;
+ header->biCompression |= (OPJ_UINT32)getc(IN) << 16;
+ header->biCompression |= (OPJ_UINT32)getc(IN) << 24;
header->biSizeImage = (OPJ_UINT32)getc(IN);
- header->biSizeImage |= (OPJ_UINT32)(getc(IN) << 8);
- header->biSizeImage |= (OPJ_UINT32)(getc(IN) << 16);
- header->biSizeImage |= (OPJ_UINT32)(getc(IN) << 24);
+ header->biSizeImage |= (OPJ_UINT32)getc(IN) << 8;
+ header->biSizeImage |= (OPJ_UINT32)getc(IN) << 16;
+ header->biSizeImage |= (OPJ_UINT32)getc(IN) << 24;
header->biXpelsPerMeter = (OPJ_UINT32)getc(IN);
- header->biXpelsPerMeter |= (OPJ_UINT32)(getc(IN) << 8);
- header->biXpelsPerMeter |= (OPJ_UINT32)(getc(IN) << 16);
- header->biXpelsPerMeter |= (OPJ_UINT32)(getc(IN) << 24);
+ header->biXpelsPerMeter |= (OPJ_UINT32)getc(IN) << 8;
+ header->biXpelsPerMeter |= (OPJ_UINT32)getc(IN) << 16;
+ header->biXpelsPerMeter |= (OPJ_UINT32)getc(IN) << 24;
header->biYpelsPerMeter = (OPJ_UINT32)getc(IN);
- header->biYpelsPerMeter |= (OPJ_UINT32)(getc(IN) << 8);
- header->biYpelsPerMeter |= (OPJ_UINT32)(getc(IN) << 16);
- header->biYpelsPerMeter |= (OPJ_UINT32)(getc(IN) << 24);
+ header->biYpelsPerMeter |= (OPJ_UINT32)getc(IN) << 8;
+ header->biYpelsPerMeter |= (OPJ_UINT32)getc(IN) << 16;
+ header->biYpelsPerMeter |= (OPJ_UINT32)getc(IN) << 24;
header->biClrUsed = (OPJ_UINT32)getc(IN);
- header->biClrUsed |= (OPJ_UINT32)(getc(IN) << 8);
- header->biClrUsed |= (OPJ_UINT32)(getc(IN) << 16);
- header->biClrUsed |= (OPJ_UINT32)(getc(IN) << 24);
+ header->biClrUsed |= (OPJ_UINT32)getc(IN) << 8;
+ header->biClrUsed |= (OPJ_UINT32)getc(IN) << 16;
+ header->biClrUsed |= (OPJ_UINT32)getc(IN) << 24;
header->biClrImportant = (OPJ_UINT32)getc(IN);
- header->biClrImportant |= (OPJ_UINT32)(getc(IN) << 8);
- header->biClrImportant |= (OPJ_UINT32)(getc(IN) << 16);
- header->biClrImportant |= (OPJ_UINT32)(getc(IN) << 24);
+ header->biClrImportant |= (OPJ_UINT32)getc(IN) << 8;
+ header->biClrImportant |= (OPJ_UINT32)getc(IN) << 16;
+ header->biClrImportant |= (OPJ_UINT32)getc(IN) << 24;
}
if(header->biSize >= 56U) {
header->biRedMask = (OPJ_UINT32)getc(IN);
- header->biRedMask |= (OPJ_UINT32)(getc(IN) << 8);
- header->biRedMask |= (OPJ_UINT32)(getc(IN) << 16);
- header->biRedMask |= (OPJ_UINT32)(getc(IN) << 24);
+ header->biRedMask |= (OPJ_UINT32)getc(IN) << 8;
+ header->biRedMask |= (OPJ_UINT32)getc(IN) << 16;
+ header->biRedMask |= (OPJ_UINT32)getc(IN) << 24;
header->biGreenMask = (OPJ_UINT32)getc(IN);
- header->biGreenMask |= (OPJ_UINT32)(getc(IN) << 8);
- header->biGreenMask |= (OPJ_UINT32)(getc(IN) << 16);
- header->biGreenMask |= (OPJ_UINT32)(getc(IN) << 24);
+ header->biGreenMask |= (OPJ_UINT32)getc(IN) << 8;
+ header->biGreenMask |= (OPJ_UINT32)getc(IN) << 16;
+ header->biGreenMask |= (OPJ_UINT32)getc(IN) << 24;
header->biBlueMask = (OPJ_UINT32)getc(IN);
- header->biBlueMask |= (OPJ_UINT32)(getc(IN) << 8);
- header->biBlueMask |= (OPJ_UINT32)(getc(IN) << 16);
- header->biBlueMask |= (OPJ_UINT32)(getc(IN) << 24);
+ header->biBlueMask |= (OPJ_UINT32)getc(IN) << 8;
+ header->biBlueMask |= (OPJ_UINT32)getc(IN) << 16;
+ header->biBlueMask |= (OPJ_UINT32)getc(IN) << 24;
header->biAlphaMask = (OPJ_UINT32)getc(IN);
- header->biAlphaMask |= (OPJ_UINT32)(getc(IN) << 8);
- header->biAlphaMask |= (OPJ_UINT32)(getc(IN) << 16);
- header->biAlphaMask |= (OPJ_UINT32)(getc(IN) << 24);
+ header->biAlphaMask |= (OPJ_UINT32)getc(IN) << 8;
+ header->biAlphaMask |= (OPJ_UINT32)getc(IN) << 16;
+ header->biAlphaMask |= (OPJ_UINT32)getc(IN) << 24;
}
if(header->biSize >= 108U) {
header->biColorSpaceType = (OPJ_UINT32)getc(IN);
- header->biColorSpaceType |= (OPJ_UINT32)(getc(IN) << 8);
- header->biColorSpaceType |= (OPJ_UINT32)(getc(IN) << 16);
- header->biColorSpaceType |= (OPJ_UINT32)(getc(IN) << 24);
+ header->biColorSpaceType |= (OPJ_UINT32)getc(IN) << 8;
+ header->biColorSpaceType |= (OPJ_UINT32)getc(IN) << 16;
+ header->biColorSpaceType |= (OPJ_UINT32)getc(IN) << 24;
if (fread(&(header->biColorSpaceEP), 1U, sizeof(header->biColorSpaceEP), IN) != sizeof(header->biColorSpaceEP)) {
fprintf(stderr,"Error, can't read BMP header\n");
}
header->biRedGamma = (OPJ_UINT32)getc(IN);
- header->biRedGamma |= (OPJ_UINT32)(getc(IN) << 8);
- header->biRedGamma |= (OPJ_UINT32)(getc(IN) << 16);
- header->biRedGamma |= (OPJ_UINT32)(getc(IN) << 24);
+ header->biRedGamma |= (OPJ_UINT32)getc(IN) << 8;
+ header->biRedGamma |= (OPJ_UINT32)getc(IN) << 16;
+ header->biRedGamma |= (OPJ_UINT32)getc(IN) << 24;
header->biGreenGamma = (OPJ_UINT32)getc(IN);
- header->biGreenGamma |= (OPJ_UINT32)(getc(IN) << 8);
- header->biGreenGamma |= (OPJ_UINT32)(getc(IN) << 16);
- header->biGreenGamma |= (OPJ_UINT32)(getc(IN) << 24);
+ header->biGreenGamma |= (OPJ_UINT32)getc(IN) << 8;
+ header->biGreenGamma |= (OPJ_UINT32)getc(IN) << 16;
+ header->biGreenGamma |= (OPJ_UINT32)getc(IN) << 24;
header->biBlueGamma = (OPJ_UINT32)getc(IN);
- header->biBlueGamma |= (OPJ_UINT32)(getc(IN) << 8);
- header->biBlueGamma |= (OPJ_UINT32)(getc(IN) << 16);
- header->biBlueGamma |= (OPJ_UINT32)(getc(IN) << 24);
+ header->biBlueGamma |= (OPJ_UINT32)getc(IN) << 8;
+ header->biBlueGamma |= (OPJ_UINT32)getc(IN) << 16;
+ header->biBlueGamma |= (OPJ_UINT32)getc(IN) << 24;
}
if(header->biSize >= 124U) {
header->biIntent = (OPJ_UINT32)getc(IN);
- header->biIntent |= (OPJ_UINT32)(getc(IN) << 8);
- header->biIntent |= (OPJ_UINT32)(getc(IN) << 16);
- header->biIntent |= (OPJ_UINT32)(getc(IN) << 24);
+ header->biIntent |= (OPJ_UINT32)getc(IN) << 8;
+ header->biIntent |= (OPJ_UINT32)getc(IN) << 16;
+ header->biIntent |= (OPJ_UINT32)getc(IN) << 24;
header->biIccProfileData = (OPJ_UINT32)getc(IN);
- header->biIccProfileData |= (OPJ_UINT32)(getc(IN) << 8);
- header->biIccProfileData |= (OPJ_UINT32)(getc(IN) << 16);
- header->biIccProfileData |= (OPJ_UINT32)(getc(IN) << 24);
+ header->biIccProfileData |= (OPJ_UINT32)getc(IN) << 8;
+ header->biIccProfileData |= (OPJ_UINT32)getc(IN) << 16;
+ header->biIccProfileData |= (OPJ_UINT32)getc(IN) << 24;
header->biIccProfileSize = (OPJ_UINT32)getc(IN);
- header->biIccProfileSize |= (OPJ_UINT32)(getc(IN) << 8);
- header->biIccProfileSize |= (OPJ_UINT32)(getc(IN) << 16);
- header->biIccProfileSize |= (OPJ_UINT32)(getc(IN) << 24);
+ header->biIccProfileSize |= (OPJ_UINT32)getc(IN) << 8;
+ header->biIccProfileSize |= (OPJ_UINT32)getc(IN) << 16;
+ header->biIccProfileSize |= (OPJ_UINT32)getc(IN) << 24;
header->biReserved = (OPJ_UINT32)getc(IN);
- header->biReserved |= (OPJ_UINT32)(getc(IN) << 8);
- header->biReserved |= (OPJ_UINT32)(getc(IN) << 16);
- header->biReserved |= (OPJ_UINT32)(getc(IN) << 24);
+ header->biReserved |= (OPJ_UINT32)getc(IN) << 8;
+ header->biReserved |= (OPJ_UINT32)getc(IN) << 16;
+ header->biReserved |= (OPJ_UINT32)getc(IN) << 24;
}
return OPJ_TRUE;
}
OPJ_UINT8 c1 = (OPJ_UINT8)getc(IN);
for (j = 0; (j < c) && (x < width) && ((OPJ_SIZE_T)pix < (OPJ_SIZE_T)beyond); j++, x++, pix++) {
- *pix = (j&1) ? (c1 & 0x0f) : ((c1>>4)&0x0f);
+ *pix = (OPJ_UINT8)((j&1) ? (c1 & 0x0fU) : ((c1>>4)&0x0fU));
}
}
else { /* absolute mode */
if((j&1) == 0) {
c1 = (OPJ_UINT8)getc(IN);
}
- *pix = (j&1) ? (c1 & 0x0f) : ((c1>>4)&0x0f);
+ *pix = (OPJ_UINT8)((j&1) ? (c1 & 0x0fU) : ((c1>>4)&0x0fU));
}
if(((c&3) == 1) || ((c&3) == 2)) { /* skip padding byte */
getc(IN);
}
}
+ if (Info_h.biWidth == 0 || Info_h.biHeight == 0) {
+ fclose(IN);
+ return NULL;
+ }
+
+ if (Info_h.biBitCount > (((OPJ_UINT32)-1) - 31) / Info_h.biWidth) {
+ fclose(IN);
+ return NULL;
+ }
stride = ((Info_h.biWidth * Info_h.biBitCount + 31U) / 32U) * 4U; /* rows are aligned on 32bits */
if (Info_h.biBitCount == 4 && Info_h.biCompression == 2) { /* RLE 4 gets decoded as 8 bits data for now... */
+ if (8 > (((OPJ_UINT32)-1) - 31) / Info_h.biWidth) {
+ fclose(IN);
+ return NULL;
+ }
stride = ((Info_h.biWidth * 8U + 31U) / 32U) * 4U;
}
+
+ if (stride > ((OPJ_UINT32)-1) / sizeof(OPJ_UINT8) / Info_h.biHeight) {
+ fclose(IN);
+ return NULL;
+ }
pData = (OPJ_UINT8 *) calloc(1, stride * Info_h.biHeight * sizeof(OPJ_UINT8));
if (pData == NULL) {
fclose(IN);
image = opj_image_create(numcmpts, &cmptparm[0], (numcmpts == 1U) ? OPJ_CLRSPC_GRAY : OPJ_CLRSPC_SRGB);
if(!image) {
fclose(IN);
+ free(pData);
return NULL;
}
if (numcmpts == 4U) {
fprintf(fdest, "%c%c%c", bc, gc, rc);
if ((i + 1) % w == 0) {
- for (pad = (3 * w) % 4 ? 4 - (3 * w) % 4 : 0; pad > 0; pad--) /* ADD */
+ for (pad = ((3 * w) % 4) ? (4 - (3 * w) % 4) : 0; pad > 0; pad--) /* ADD */
fprintf(fdest, "%c", 0);
}
}
<<-- <<-- <<-- <<-- */
fdest = fopen(outfile, "wb");
+ if (!fdest) {
+ fprintf(stderr, "ERROR -> failed to open %s for writing\n", outfile);
+ return 1;
+ }
w = (int)image->comps[0].w;
h = (int)image->comps[0].h;
fprintf(fdest, "%c", (OPJ_UINT8)r);
if ((i + 1) % w == 0) {
- for (pad = w % 4 ? 4 - w % 4 : 0; pad > 0; pad--) /* ADD */
+ for (pad = (w % 4) ? (4 - w % 4) : 0; pad > 0; pad--) /* ADD */
fprintf(fdest, "%c", 0);
}
}