Fix some resource leaks

This commit is contained in:
mayeut 2015-09-24 23:32:03 +02:00
parent f82d7f3a63
commit f9df8ba19a
3 changed files with 68 additions and 19 deletions

View File

@ -734,12 +734,16 @@ opj_image_t* tgatoimage(const char *filename, opj_cparameters_t *parameters) {
return 0; return 0;
} }
if (!tga_readheader(f, &pixel_bit_depth, &image_width, &image_height, &flip_image)) if (!tga_readheader(f, &pixel_bit_depth, &image_width, &image_height, &flip_image)) {
fclose(f);
return NULL; return NULL;
}
/* We currently only support 24 & 32 bit tga's ... */ /* We currently only support 24 & 32 bit tga's ... */
if (!((pixel_bit_depth == 24) || (pixel_bit_depth == 32))) if (!((pixel_bit_depth == 24) || (pixel_bit_depth == 32))) {
fclose(f);
return NULL; return NULL;
}
/* initialize image components */ /* initialize image components */
memset(&cmptparm[0], 0, 4 * sizeof(opj_image_cmptparm_t)); memset(&cmptparm[0], 0, 4 * sizeof(opj_image_cmptparm_t));
@ -772,8 +776,11 @@ opj_image_t* tgatoimage(const char *filename, opj_cparameters_t *parameters) {
/* create the image */ /* create the image */
image = opj_image_create((OPJ_UINT32)numcomps, &cmptparm[0], color_space); image = opj_image_create((OPJ_UINT32)numcomps, &cmptparm[0], color_space);
if (!image) if (!image) {
fclose(f);
return NULL; return NULL;
}
/* set image offset and reference grid */ /* set image offset and reference grid */
image->x0 = (OPJ_UINT32)parameters->image_offset_x0; image->x0 = (OPJ_UINT32)parameters->image_offset_x0;
@ -801,18 +808,21 @@ opj_image_t* tgatoimage(const char *filename, opj_cparameters_t *parameters) {
{ {
fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
opj_image_destroy(image); opj_image_destroy(image);
fclose(f);
return NULL; return NULL;
} }
if ( !fread(&g, 1, 1, f) ) if ( !fread(&g, 1, 1, f) )
{ {
fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
opj_image_destroy(image); opj_image_destroy(image);
fclose(f);
return NULL; return NULL;
} }
if ( !fread(&r, 1, 1, f) ) if ( !fread(&r, 1, 1, f) )
{ {
fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
opj_image_destroy(image); opj_image_destroy(image);
fclose(f);
return NULL; return NULL;
} }
@ -831,24 +841,28 @@ opj_image_t* tgatoimage(const char *filename, opj_cparameters_t *parameters) {
{ {
fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
opj_image_destroy(image); opj_image_destroy(image);
fclose(f);
return NULL; return NULL;
} }
if ( !fread(&g, 1, 1, f) ) if ( !fread(&g, 1, 1, f) )
{ {
fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
opj_image_destroy(image); opj_image_destroy(image);
fclose(f);
return NULL; return NULL;
} }
if ( !fread(&r, 1, 1, f) ) if ( !fread(&r, 1, 1, f) )
{ {
fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
opj_image_destroy(image); opj_image_destroy(image);
fclose(f);
return NULL; return NULL;
} }
if ( !fread(&a, 1, 1, f) ) if ( !fread(&a, 1, 1, f) )
{ {
fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
opj_image_destroy(image); opj_image_destroy(image);
fclose(f);
return NULL; return NULL;
} }
@ -863,6 +877,7 @@ opj_image_t* tgatoimage(const char *filename, opj_cparameters_t *parameters) {
fprintf(stderr, "Currently unsupported bit depth : %s\n", filename); fprintf(stderr, "Currently unsupported bit depth : %s\n", filename);
} }
} }
fclose(f);
return image; return image;
} }
@ -889,6 +904,7 @@ int imagetotga(opj_image_t * image, const char *outfile) {
if ((image->comps[0].dx != image->comps[i+1].dx) if ((image->comps[0].dx != image->comps[i+1].dx)
||(image->comps[0].dy != image->comps[i+1].dy) ||(image->comps[0].dy != image->comps[i+1].dy)
||(image->comps[0].prec != image->comps[i+1].prec)) { ||(image->comps[0].prec != image->comps[i+1].prec)) {
fclose(fdest);
fprintf(stderr, "Unable to create a tga file with such J2K image charateristics."); fprintf(stderr, "Unable to create a tga file with such J2K image charateristics.");
return 1; return 1;
} }
@ -1081,6 +1097,7 @@ opj_image_t* pgxtoimage(const char *filename, opj_cparameters_t *parameters) {
fseek(f, 0, SEEK_SET); fseek(f, 0, SEEK_SET);
if( fscanf(f, "PG%[ \t]%c%c%[ \t+-]%d%[ \t]%d%[ \t]%d",temp,&endian1,&endian2,signtmp,&prec,temp,&w,temp,&h) != 9){ if( fscanf(f, "PG%[ \t]%c%c%[ \t+-]%d%[ \t]%d%[ \t]%d",temp,&endian1,&endian2,signtmp,&prec,temp,&w,temp,&h) != 9){
fclose(f);
fprintf(stderr, "ERROR: Failed to read the right number of element from the fscanf() function!\n"); fprintf(stderr, "ERROR: Failed to read the right number of element from the fscanf() function!\n");
return NULL; return NULL;
} }
@ -1098,6 +1115,7 @@ opj_image_t* pgxtoimage(const char *filename, opj_cparameters_t *parameters) {
} else if (endian2=='M' && endian1=='L') { } else if (endian2=='M' && endian1=='L') {
bigendian = 0; bigendian = 0;
} else { } else {
fclose(f);
fprintf(stderr, "Bad pgx header, please check input file\n"); fprintf(stderr, "Bad pgx header, please check input file\n");
return NULL; return NULL;
} }
@ -1212,7 +1230,7 @@ int imagetopgx(opj_image_t * image, const char *outfile)
FILE *fdest = NULL; FILE *fdest = NULL;
for (compno = 0; compno < image->numcomps; compno++) for (compno = 0; compno < image->numcomps; compno++)
{ {
opj_image_comp_t *comp = &image->comps[compno]; opj_image_comp_t *comp = &image->comps[compno];
char bname[256]; /* buffer for name */ char bname[256]; /* buffer for name */
char *name = bname; /* pointer */ char *name = bname; /* pointer */
@ -1223,25 +1241,30 @@ int imagetopgx(opj_image_t * image, const char *outfile)
const size_t total = dotpos + 1 + 1 + 4; /* '-' + '[1-3]' + '.pgx' */ const size_t total = dotpos + 1 + 1 + 4; /* '-' + '[1-3]' + '.pgx' */
if( outfile[dotpos] != '.' ) if( outfile[dotpos] != '.' )
{ {
/* `pgx` was recognized but there is no dot at expected position */ /* `pgx` was recognized but there is no dot at expected position */
fprintf(stderr, "ERROR -> Impossible happen." ); fprintf(stderr, "ERROR -> Impossible happen." );
goto fin; goto fin;
} }
if( total > 256 ) if( total > 256 )
{ {
name = (char*)malloc(total+1); name = (char*)malloc(total+1);
} if (name == NULL) {
goto fin;
}
}
strncpy(name, outfile, dotpos); strncpy(name, outfile, dotpos);
sprintf(name+dotpos, "_%d.pgx", compno); sprintf(name+dotpos, "_%d.pgx", compno);
fdest = fopen(name, "wb"); fdest = fopen(name, "wb");
/* dont need name anymore */ /* dont need name anymore */
if( total > 256 ) free(name);
if (!fdest) if (!fdest)
{ {
fprintf(stderr, "ERROR -> failed to open %s for writing\n", name); fprintf(stderr, "ERROR -> failed to open %s for writing\n", name);
if( total > 256 ) free(name);
goto fin; goto fin;
} }
w = (int)image->comps[compno].w; w = (int)image->comps[compno].w;
h = (int)image->comps[compno].h; h = (int)image->comps[compno].h;
@ -1257,26 +1280,28 @@ int imagetopgx(opj_image_t * image, const char *outfile)
nbytes = 4; nbytes = 4;
for (i = 0; i < w * h; i++) for (i = 0; i < w * h; i++)
{ {
/* FIXME: clamp func is being called within a loop */ /* FIXME: clamp func is being called within a loop */
const int val = clamp(image->comps[compno].data[i], const int val = clamp(image->comps[compno].data[i],
(int)comp->prec, (int)comp->sgnd); (int)comp->prec, (int)comp->sgnd);
for (j = nbytes - 1; j >= 0; j--) for (j = nbytes - 1; j >= 0; j--)
{ {
int v = (int)(val >> (j * 8)); int v = (int)(val >> (j * 8));
unsigned char byte = (unsigned char)v; unsigned char byte = (unsigned char)v;
res = fwrite(&byte, 1, 1, fdest); res = fwrite(&byte, 1, 1, fdest);
if( res < 1 ) if( res < 1 )
{ {
fprintf(stderr, "failed to write 1 byte for %s\n", name); fprintf(stderr, "failed to write 1 byte for %s\n", name);
if( total > 256 ) free(name);
goto fin; goto fin;
} }
} }
} }
if( total > 256 ) free(name);
fclose(fdest); fdest = NULL; fclose(fdest); fdest = NULL;
} }
fails = 0; fails = 0;
fin: fin:
if(fdest) fclose(fdest); if(fdest) fclose(fdest);
@ -1650,6 +1675,7 @@ opj_image_t* pnmtoimage(const char *filename, opj_cparameters_t *parameters) {
{ {
fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
opj_image_destroy(image); opj_image_destroy(image);
fclose(fp);
return NULL; return NULL;
} }
if(one) if(one)
@ -2003,6 +2029,7 @@ static opj_image_t* rawtoimage_common(const char *filename, opj_cparameters_t *p
if (!cmptparm) { if (!cmptparm) {
fprintf(stderr, "Failed to allocate image components parameters !!\n"); fprintf(stderr, "Failed to allocate image components parameters !!\n");
fprintf(stderr,"Aborting\n"); fprintf(stderr,"Aborting\n");
fclose(f);
return NULL; return NULL;
} }
/* initialize image components */ /* initialize image components */
@ -2036,6 +2063,8 @@ static opj_image_t* rawtoimage_common(const char *filename, opj_cparameters_t *p
for (i = 0; i < nloop; i++) { for (i = 0; i < nloop; i++) {
if (!fread(&value, 1, 1, f)) { if (!fread(&value, 1, 1, f)) {
fprintf(stderr,"Error reading raw file. End of file probably reached.\n"); fprintf(stderr,"Error reading raw file. End of file probably reached.\n");
opj_image_destroy(image);
fclose(f);
return NULL; return NULL;
} }
image->comps[compno].data[i] = raw_cp->rawSigned?(char)value:value; image->comps[compno].data[i] = raw_cp->rawSigned?(char)value:value;
@ -2052,10 +2081,14 @@ static opj_image_t* rawtoimage_common(const char *filename, opj_cparameters_t *p
unsigned char temp2; unsigned char temp2;
if (!fread(&temp1, 1, 1, f)) { if (!fread(&temp1, 1, 1, f)) {
fprintf(stderr,"Error reading raw file. End of file probably reached.\n"); fprintf(stderr,"Error reading raw file. End of file probably reached.\n");
opj_image_destroy(image);
fclose(f);
return NULL; return NULL;
} }
if (!fread(&temp2, 1, 1, f)) { if (!fread(&temp2, 1, 1, f)) {
fprintf(stderr,"Error reading raw file. End of file probably reached.\n"); fprintf(stderr,"Error reading raw file. End of file probably reached.\n");
opj_image_destroy(image);
fclose(f);
return NULL; return NULL;
} }
if( big_endian ) if( big_endian )
@ -2072,6 +2105,8 @@ static opj_image_t* rawtoimage_common(const char *filename, opj_cparameters_t *p
} }
else { else {
fprintf(stderr,"OpenJPEG cannot encode raw components with bit depth higher than 16 bits.\n"); fprintf(stderr,"OpenJPEG cannot encode raw components with bit depth higher than 16 bits.\n");
opj_image_destroy(image);
fclose(f);
return NULL; return NULL;
} }

View File

@ -729,6 +729,7 @@ opj_image_t* bmptoimage(const char *filename, opj_cparameters_t *parameters)
image = opj_image_create(numcmpts, &cmptparm[0], (numcmpts == 1U) ? OPJ_CLRSPC_GRAY : OPJ_CLRSPC_SRGB); image = opj_image_create(numcmpts, &cmptparm[0], (numcmpts == 1U) ? OPJ_CLRSPC_GRAY : OPJ_CLRSPC_SRGB);
if(!image) { if(!image) {
fclose(IN); fclose(IN);
free(pData);
return NULL; return NULL;
} }
if (numcmpts == 4U) { if (numcmpts == 4U) {

View File

@ -391,6 +391,7 @@ static unsigned int get_num_images(char *imgdirpath){
continue; continue;
num_images++; num_images++;
} }
closedir(dir);
return num_images; return num_images;
} }
@ -416,6 +417,7 @@ static int load_images(dircnt_t *dirptr, char *imgdirpath){
strcpy(dirptr->filename[i],content->d_name); strcpy(dirptr->filename[i],content->d_name);
i++; i++;
} }
closedir(dir);
return 0; return 0;
} }
@ -1058,9 +1060,16 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param
lStrLen = (size_t)ftell(lFile); lStrLen = (size_t)ftell(lFile);
fseek(lFile,0,SEEK_SET); fseek(lFile,0,SEEK_SET);
lMatrix = (char *) malloc(lStrLen + 1); lMatrix = (char *) malloc(lStrLen + 1);
if (lMatrix == NULL) {
fclose(lFile);
return 1;
}
lStrFread = fread(lMatrix, 1, lStrLen, lFile); lStrFread = fread(lMatrix, 1, lStrLen, lFile);
fclose(lFile); fclose(lFile);
if( lStrLen != lStrFread ) return 1; if( lStrLen != lStrFread ) {
free(lMatrix);
return 1;
}
lMatrix[lStrLen] = 0; lMatrix[lStrLen] = 0;
lCurrentPtr = lMatrix; lCurrentPtr = lMatrix;
@ -1080,6 +1089,10 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param
lMctComp = lNbComp * lNbComp; lMctComp = lNbComp * lNbComp;
lTotalComp = lMctComp + lNbComp; lTotalComp = lMctComp + lNbComp;
lSpace = (float *) malloc((size_t)lTotalComp * sizeof(float)); lSpace = (float *) malloc((size_t)lTotalComp * sizeof(float));
if(lSpace == NULL) {
free(lMatrix);
return 1;
}
lCurrentDoublePtr = lSpace; lCurrentDoublePtr = lSpace;
for (i2=0;i2<lMctComp;++i2) { for (i2=0;i2<lMctComp;++i2) {
lStrLen = strlen(lCurrentPtr) + 1; lStrLen = strlen(lCurrentPtr) + 1;