Introduce more loader return codes

Used to avoid potentially wasting time trying to load corrupt images
by trying loaders which won't recognize the image anyway.
This commit is contained in:
Kim Woelders 2021-09-16 09:36:05 +02:00
parent f3db9c99b6
commit bf93574b8b
21 changed files with 217 additions and 254 deletions

View File

@ -82,7 +82,9 @@ typedef enum {
IMLIB_LOAD_ERROR_OUT_OF_FILE_DESCRIPTORS,
IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_WRITE,
IMLIB_LOAD_ERROR_OUT_OF_DISK_SPACE,
IMLIB_LOAD_ERROR_UNKNOWN
IMLIB_LOAD_ERROR_UNKNOWN,
IMLIB_LOAD_ERROR_IMAGE_READ,
IMLIB_LOAD_ERROR_IMAGE_FRAME
} Imlib_Load_Error;
/* Encodings known to Imlib2 (so far) */

View File

@ -359,7 +359,7 @@ __imlib_LoadImageWrapper(const ImlibLoader * l, ImlibImage * im, int load_data)
if (rc <= LOAD_FAIL)
{
/* Failed - clean up */
DP("%s: Failed\n", __func__);
DP("%s: Failed (rc=%d)\n", __func__, rc);
if (im->w != 0 || im->h != 0)
{
@ -552,13 +552,16 @@ __imlib_LoadImage(const char *file, ImlibLoadArgs * ila)
if (best_loader)
loader_ret = __imlib_LoadImageWrapper(best_loader, im, ila->immed);
if (loader_ret > LOAD_FAIL)
switch (loader_ret)
{
case LOAD_BREAK: /* Break signaled by progress callback */
case LOAD_SUCCESS: /* Image loaded successfully */
/* Loader accepted image */
im->loader = best_loader;
}
else
{
ImlibLoader **loaders = __imlib_GetLoaderList();
break;
case LOAD_FAIL: /* Image was not recognized by loader */
ImlibLoader ** loaders = __imlib_GetLoaderList();
ImlibLoader *l, *previous_l;
errno = 0;
@ -588,6 +591,16 @@ __imlib_LoadImage(const char *file, ImlibLoadArgs * ila)
*loaders = l;
}
}
break;
default: /* We should not go here */
case LOAD_OOM: /* Could not allocate memory */
case LOAD_BADFILE: /* File could not be accessed */
/* Unlikely that another loader will succeed */
case LOAD_BADIMAGE: /* Image is corrupt */
case LOAD_BADFRAME: /* Requested frame not found */
/* Signature was good but file was somehow not */
break;
}
im->lc = NULL;
@ -596,11 +609,31 @@ __imlib_LoadImage(const char *file, ImlibLoadArgs * ila)
fclose(im->fp);
im->fp = NULL;
/* all loaders have been tried and they all failed. free the skeleton */
/* image struct we had and return NULL */
if (loader_ret <= LOAD_FAIL)
{
ila->err = IMLIB_LOAD_ERROR_NO_LOADER_FOR_FILE_FORMAT;
/* Image loading failed.
* Free the skeleton image struct we had and return NULL */
switch (loader_ret)
{
default: /* We should not go here */
ila->err = IMLIB_LOAD_ERROR_UNKNOWN;
break;
case LOAD_FAIL:
ila->err = IMLIB_LOAD_ERROR_NO_LOADER_FOR_FILE_FORMAT;
break;
case LOAD_OOM:
ila->err = IMLIB_LOAD_ERROR_OUT_OF_MEMORY;
break;
case LOAD_BADFILE:
ila->err = IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_READ;
break;
case LOAD_BADIMAGE:
ila->err = IMLIB_LOAD_ERROR_IMAGE_READ;
break;
case LOAD_BADFRAME:
ila->err = IMLIB_LOAD_ERROR_IMAGE_FRAME;
break;
}
__imlib_ConsumeImage(im);
return NULL;
}

View File

@ -143,9 +143,13 @@ int __imlib_CurrentCacheSize(void);
#define UPDATE_FLAG(flags, f, set) \
do { if (set) SET_FLAG(flags, f); else UNSET_FLAG(flags, f); } while(0)
#define LOAD_FAIL 0
#define LOAD_SUCCESS 1
#define LOAD_BREAK 2
#define LOAD_BREAK 2 /* Break signaled by progress callback */
#define LOAD_SUCCESS 1 /* Image loaded successfully */
#define LOAD_FAIL 0 /* Image was not recognized by loader */
#define LOAD_OOM -1 /* Could not allocate memory */
#define LOAD_BADFILE -2 /* File could not be accessed */
#define LOAD_BADIMAGE -3 /* Image is corrupt */
#define LOAD_BADFRAME -4 /* Requested frame not found */
/* 32767 is the maximum pixmap dimension and ensures that
* (w * h * sizeof(DATA32)) won't exceed ULONG_MAX */

View File

@ -51,7 +51,7 @@ load2(ImlibImage * im, int load_data)
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
if (fdata == MAP_FAILED)
return rc;
return LOAD_BADFILE;
mm_init(fdata, im->fsize);
@ -67,22 +67,24 @@ load2(ImlibImage * im, int load_data)
im->w = im->h = alpha = 0;
sscanf(fptr, "ARGB %i %i %i", &im->w, &im->h, &alpha);
if (im->w <= 0 || im->h <= 0)
goto quit;
rc = LOAD_BADIMAGE; /* Format accepted */
if (!IMAGE_DIMENSIONS_OK(im->w, im->h))
goto quit;
UPDATE_FLAG(im->flags, F_HAS_ALPHA, alpha);
if (!load_data)
{
rc = LOAD_SUCCESS;
goto quit;
}
QUIT_WITH_RC(LOAD_SUCCESS);
/* Load data */
ptr = __imlib_AllocateData(im);
if (!ptr)
goto quit;
QUIT_WITH_RC(LOAD_OOM);
mm_seek(row - fptr);
@ -98,10 +100,7 @@ load2(ImlibImage * im, int load_data)
ptr += im->w;
if (im->lc && __imlib_LoadProgressRows(im, y, 1))
{
rc = LOAD_BREAK;
goto quit;
}
QUIT_WITH_RC(LOAD_BREAK);
}
rc = LOAD_SUCCESS;
@ -109,8 +108,7 @@ load2(ImlibImage * im, int load_data)
quit:
if (rc <= 0)
__imlib_FreeData(im);
if (fdata != MAP_FAILED)
munmap(fdata, im->fsize);
munmap(fdata, im->fsize);
return rc;
}
@ -154,10 +152,7 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
ptr += im->w;
if (im->lc && __imlib_LoadProgressRows(im, y, 1))
{
rc = LOAD_BREAK;
goto quit;
}
QUIT_WITH_RC(LOAD_BREAK);
}
rc = LOAD_SUCCESS;

View File

@ -180,7 +180,7 @@ load2(ImlibImage * im, int load_data)
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
if (fdata == MAP_FAILED)
return rc;
return LOAD_BADFILE;
fptr = fdata;
mm_init(fdata, im->fsize);
@ -215,6 +215,8 @@ load2(ImlibImage * im, int load_data)
if (mm_read(&bih.header_size + 1, bih.header_size - 4))
goto quit;
rc = LOAD_BADIMAGE; /* Format accepted */
comp = BI_RGB;
amask = rmask = gmask = bmask = 0;
ashift1 = rshift1 = gshift1 = bshift1 = 0;
@ -397,15 +399,12 @@ load2(ImlibImage * im, int load_data)
im->h = h;
if (!load_data)
{
rc = LOAD_SUCCESS;
goto quit;
}
QUIT_WITH_RC(LOAD_SUCCESS);
/* Load data */
if (!__imlib_AllocateData(im))
goto quit;
QUIT_WITH_RC(LOAD_OOM);
fptr += bfh_offset;
@ -441,10 +440,7 @@ load2(ImlibImage * im, int load_data)
ptr -= w * 2;
if (im->lc && __imlib_LoadProgressRows(im, h - y - 1, -1))
{
rc = LOAD_BREAK;
goto quit;
}
QUIT_WITH_RC(LOAD_BREAK);
}
break;
}
@ -549,10 +545,7 @@ load2(ImlibImage * im, int load_data)
progress_bc4:
if (im->lc && (x == w) &&
__imlib_LoadProgressRows(im, h - y - 1, -1))
{
rc = LOAD_BREAK;
goto quit;
}
QUIT_WITH_RC(LOAD_BREAK);
}
break;
@ -572,10 +565,7 @@ load2(ImlibImage * im, int load_data)
ptr -= w * 2;
if (im->lc && __imlib_LoadProgressRows(im, h - y - 1, -1))
{
rc = LOAD_BREAK;
goto quit;
}
QUIT_WITH_RC(LOAD_BREAK);
}
break;
}
@ -664,10 +654,7 @@ load2(ImlibImage * im, int load_data)
progress_bc8:
if (im->lc && (x == w) &&
__imlib_LoadProgressRows(im, h - y - 1, -1))
{
rc = LOAD_BREAK;
goto quit;
}
QUIT_WITH_RC(LOAD_BREAK);
}
break;
@ -684,10 +671,7 @@ load2(ImlibImage * im, int load_data)
buffer_ptr += skip;
if (im->lc && __imlib_LoadProgressRows(im, h - y - 1, -1))
{
rc = LOAD_BREAK;
goto quit;
}
QUIT_WITH_RC(LOAD_BREAK);
}
break;
}
@ -717,10 +701,7 @@ load2(ImlibImage * im, int load_data)
buffer_ptr += skip;
if (im->lc && __imlib_LoadProgressRows(im, h - y - 1, -1))
{
rc = LOAD_BREAK;
goto quit;
}
QUIT_WITH_RC(LOAD_BREAK);
}
break;
@ -741,10 +722,7 @@ load2(ImlibImage * im, int load_data)
buffer_ptr += skip;
if (im->lc && __imlib_LoadProgressRows(im, h - y - 1, -1))
{
rc = LOAD_BREAK;
goto quit;
}
QUIT_WITH_RC(LOAD_BREAK);
}
break;
@ -772,10 +750,7 @@ load2(ImlibImage * im, int load_data)
buffer_ptr += skip;
if (im->lc && __imlib_LoadProgressRows(im, h - y - 1, -1))
{
rc = LOAD_BREAK;
goto quit;
}
QUIT_WITH_RC(LOAD_BREAK);
}
break;
}
@ -785,8 +760,7 @@ load2(ImlibImage * im, int load_data)
quit:
if (rc <= 0)
__imlib_FreeData(im);
if (fdata != MAP_FAILED)
munmap(fdata, im->fsize);
munmap(fdata, im->fsize);
return rc;
}

View File

@ -45,12 +45,15 @@ uncompress_file(FILE * fp, int dest)
int
load2(ImlibImage * im, int load_data)
{
int rc;
ImlibLoader *loader;
int dest, res;
const char *s, *p, *q;
char tmp[] = "/tmp/imlib2_loader_bz2-XXXXXX";
char *real_ext;
rc = LOAD_FAIL;
/* make sure this file ends in ".bz2" and that there's another ext
* (e.g. "foo.png.bz2") */
for (p = s = im->real_file, q = NULL; *s; s++)
@ -61,18 +64,18 @@ load2(ImlibImage * im, int load_data)
p = s + 1;
}
if (!q || strcasecmp(p, "bz2"))
return 0;
return rc;
if (!(real_ext = strndup(q, p - q - 1)))
return 0;
return rc;
loader = __imlib_FindBestLoaderForFormat(real_ext, 0);
free(real_ext);
if (!loader)
return 0;
return rc;
if ((dest = mkstemp(tmp)) < 0)
return 0;
return rc;
res = uncompress_file(im->fp, dest);
close(dest);

View File

@ -13,4 +13,7 @@ __EXPORT__ char save(ImlibImage * im, ImlibProgressFunction progress,
char progress_granularity);
__EXPORT__ void formats(ImlibLoader * l);
#define QUIT_WITH_RC(_err) { rc = _err; goto quit; }
#define QUITx_WITH_RC(_err, _lbl) { rc = _err; goto _lbl; }
#endif /* __LOADER_COMMON_H */

View File

@ -29,13 +29,15 @@ load2(ImlibImage * im, int load_data)
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
if (fdata == MAP_FAILED)
return rc;
return LOAD_BADFILE;
/* read and check the header */
hdr = fdata;
if (memcmp("farbfeld", hdr->magic, sizeof(hdr->magic)))
goto quit;
rc = LOAD_BADIMAGE; /* Format accepted */
im->w = ntohl(hdr->w);
im->h = ntohl(hdr->h);
if (!IMAGE_DIMENSIONS_OK(im->w, im->h))
@ -44,15 +46,12 @@ load2(ImlibImage * im, int load_data)
SET_FLAG(im->flags, F_HAS_ALPHA);
if (!load_data)
{
rc = LOAD_SUCCESS;
goto quit;
}
QUIT_WITH_RC(LOAD_SUCCESS);
/* Load data */
if (!__imlib_AllocateData(im))
goto quit;
QUIT_WITH_RC(LOAD_OOM);
rowlen = 4 * im->w; /* RGBA */
@ -76,10 +75,7 @@ load2(ImlibImage * im, int load_data)
}
if (im->lc && __imlib_LoadProgressRows(im, i, 1))
{
rc = LOAD_BREAK;
goto quit;
}
QUIT_WITH_RC(LOAD_BREAK);
}
rc = LOAD_SUCCESS;
@ -87,8 +83,7 @@ load2(ImlibImage * im, int load_data)
quit:
if (rc <= 0)
__imlib_FreeData(im);
if (fdata != MAP_FAILED)
munmap(fdata, im->fsize);
munmap(fdata, im->fsize);
return rc;
}
@ -145,10 +140,7 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
goto quit;
if (im->lc && __imlib_LoadProgressRows(im, i, 1))
{
rc = LOAD_BREAK;
goto quit;
}
QUIT_WITH_RC(LOAD_BREAK);
}
rc = LOAD_SUCCESS;

View File

@ -51,7 +51,8 @@ load2(ImlibImage * im, int load_data)
if (!gif)
return LOAD_FAIL;
rc = LOAD_FAIL;
rc = LOAD_BADIMAGE; /* Format accepted */
rows = NULL;
transp = -1;
fcount = 0;
@ -144,13 +145,13 @@ load2(ImlibImage * im, int load_data)
rows = calloc(im->h, sizeof(GifRowType));
if (!rows)
goto quit;
QUIT_WITH_RC(LOAD_OOM);
for (i = 0; i < im->h; i++)
{
rows[i] = calloc(im->w, sizeof(GifPixelType));
if (!rows[i])
goto quit;
QUIT_WITH_RC(LOAD_OOM);
}
if (gif->Image.Interlace)
@ -221,19 +222,21 @@ load2(ImlibImage * im, int load_data)
im->frame_flags |= FF_IMAGE_ANIMATED;
if (!rows)
goto quit;
if (!load_data)
{
rc = LOAD_SUCCESS;
if (frame > 1 && frame > im->frame_count)
QUIT_WITH_RC(LOAD_BADFRAME);
goto quit;
}
if (!load_data)
QUIT_WITH_RC(LOAD_SUCCESS);
/* Load data */
ptr = __imlib_AllocateData(im);
if (!ptr)
goto quit;
QUIT_WITH_RC(LOAD_OOM);
for (i = 0; i < im->h; i++)
{
@ -243,10 +246,7 @@ load2(ImlibImage * im, int load_data)
}
if (!multiframe && im->lc && __imlib_LoadProgressRows(im, i, 1))
{
rc = LOAD_BREAK;
goto quit;
}
QUIT_WITH_RC(LOAD_BREAK);
}
if (multiframe && im->lc)

View File

@ -398,7 +398,7 @@ load2(ImlibImage * im, int load_data)
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
if (fdata == MAP_FAILED)
return rc;
return LOAD_BADFILE;
mm_init(fdata, im->fsize);
@ -416,7 +416,7 @@ load2(ImlibImage * im, int load_data)
ico.ie = calloc(ico.idir.icons, sizeof(ie_t));
if (!ico.ie)
goto quit;
QUIT_WITH_RC(LOAD_OOM);
D("Loading '%s' Nicons = %d\n", im->real_file, ico.idir.icons);
@ -426,6 +426,8 @@ load2(ImlibImage * im, int load_data)
ico_read_icon(&ico, i);
}
rc = LOAD_BADIMAGE; /* Format accepted */
if (ico_load(&ico, im, load_data))
{
if (im->lc)
@ -437,8 +439,7 @@ load2(ImlibImage * im, int load_data)
ico_delete(&ico);
if (rc <= 0)
__imlib_FreeData(im);
if (fdata != MAP_FAILED)
munmap(fdata, im->fsize);
munmap(fdata, im->fsize);
return rc;
}

View File

@ -496,28 +496,30 @@ write_tags(ImlibImage * im, lopt * opt)
int
load2(ImlibImage * im, int load_data)
{
int rc;
ImlibLoader *loader;
lopt opt;
int res;
res = LOAD_FAIL;
rc = LOAD_FAIL;
opt.ctx = NULL;
if (!get_options(&opt, im))
goto fail_context;
goto quit;
rc = LOAD_BADIMAGE; /* Format accepted */
if (!get_loader(&opt, &loader))
goto fail_context;
goto quit;
if (loader)
{
char tmp[] = "/tmp/imlib2_loader_id3-XXXXXX";
int dest;
int dest, res;
if ((dest = mkstemp(tmp)) < 0)
{
fprintf(stderr, "Unable to create a temporary file\n");
goto fail_context;
goto quit;
}
res = extract_pic(id3_tag_get_frame(opt.ctx->tag, opt.index - 1), dest);
@ -526,10 +528,10 @@ load2(ImlibImage * im, int load_data)
if (!res)
{
unlink(tmp);
goto fail_context;
goto quit;
}
res = __imlib_LoadEmbedded(loader, im, tmp, load_data);
rc = __imlib_LoadEmbedded(loader, im, tmp, load_data);
unlink(tmp);
}
@ -550,7 +552,7 @@ load2(ImlibImage * im, int load_data)
if (!data || !length)
{
fprintf(stderr, "No link image URL present\n");
goto fail_context;
goto quit;
}
url = (char *)malloc((length + 1) * sizeof(char));
strncpy(url, data, length);
@ -560,10 +562,10 @@ load2(ImlibImage * im, int load_data)
{
fprintf(stderr, "No loader found for file %s\n", file);
free(url);
goto fail_context;
goto quit;
}
res = __imlib_LoadEmbedded(loader, im, file, load_data);
rc = __imlib_LoadEmbedded(loader, im, file, load_data);
if (!im->loader)
__imlib_AttachTag(im, "id3-link-url", 0, url, destructor_data);
@ -589,11 +591,11 @@ load2(ImlibImage * im, int load_data)
}
#endif
fail_context:
quit:
if (opt.ctx)
context_delref(opt.ctx);
return res;
return rc;
}
void

View File

@ -75,10 +75,7 @@ load2(ImlibImage * im, int load_data)
/* set up error handling */
jds.err = _jdata_init(&jdata);
if (sigsetjmp(jdata.setjmp_buffer, 1))
{
rc = LOAD_FAIL;
goto quit;
}
QUIT_WITH_RC(LOAD_FAIL);
rc = LOAD_FAIL;
@ -87,6 +84,8 @@ load2(ImlibImage * im, int load_data)
jpeg_save_markers(&jds, JPEG_APP0 + 1, 256);
jpeg_read_header(&jds, TRUE);
rc = LOAD_BADIMAGE; /* Format accepted */
/* Get orientation */
ei.orientation = ORIENT_TOPLEFT;
@ -119,10 +118,7 @@ load2(ImlibImage * im, int load_data)
UNSET_FLAG(im->flags, F_HAS_ALPHA);
if (!load_data)
{
rc = LOAD_SUCCESS;
goto quit;
}
QUIT_WITH_RC(LOAD_SUCCESS);
/* Load data */
@ -135,12 +131,12 @@ load2(ImlibImage * im, int load_data)
jdata.data = malloc(w * 16 * jds.output_components);
if (!jdata.data)
goto quit;
QUIT_WITH_RC(LOAD_OOM);
/* must set the im->data member before callign progress function */
ptr2 = __imlib_AllocateData(im);
if (!ptr2)
goto quit;
QUIT_WITH_RC(LOAD_OOM);
for (y = 0; y < jds.rec_outbuf_height; y++)
line[y] = jdata.data + (y * w * jds.output_components);
@ -232,11 +228,9 @@ load2(ImlibImage * im, int load_data)
if (ei.orientation != ORIENT_TOPLEFT &&
ei.orientation != ORIENT_TOPRIGHT)
continue;
if (im->lc && __imlib_LoadProgressRows(im, l, scans))
{
rc = LOAD_BREAK;
goto quit;
}
QUIT_WITH_RC(LOAD_BREAK);
}
if (ei.orientation != ORIENT_TOPLEFT && ei.orientation != ORIENT_TOPRIGHT)
{
@ -345,10 +339,7 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
jpeg_write_scanlines(&jcs, jbuf, 1);
if (im->lc && __imlib_LoadProgressRows(im, y, 1))
{
rc = LOAD_BREAK;
goto quit;
}
QUIT_WITH_RC(LOAD_BREAK);
}
rc = LOAD_SUCCESS;

View File

@ -449,12 +449,13 @@ load2(ImlibImage * im, int load_data)
ILBM ilbm;
rc = LOAD_FAIL;
plane[0] = NULL;
memset(&ilbm, 0, sizeof(ilbm));
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
if (fdata == MAP_FAILED)
return rc;
return LOAD_BADFILE;
plane[0] = NULL;
memset(&ilbm, 0, sizeof(ilbm));
/*----------
* Load the chunk(s) we're interested in. If load_data is not true, then we only
@ -463,6 +464,8 @@ load2(ImlibImage * im, int load_data)
if (!loadchunks(fdata, im->fsize, &ilbm, load_data))
goto quit;
rc = LOAD_BADIMAGE; /* Format accepted */
/*----------
* Use and check header.
*----------*/
@ -495,10 +498,7 @@ load2(ImlibImage * im, int load_data)
UNSET_FLAG(im->flags, F_HAS_ALPHA);
if (!load_data)
{
rc = LOAD_SUCCESS;
goto quit;
}
QUIT_WITH_RC(LOAD_SUCCESS);
ilbm.ham = 0;
ilbm.hbrite = 0;
@ -528,16 +528,15 @@ load2(ImlibImage * im, int load_data)
* 0 bit.
*----------*/
__imlib_AllocateData(im);
if (!im->data)
goto quit;
if (!__imlib_AllocateData(im))
QUIT_WITH_RC(LOAD_OOM);
n = ilbm.depth;
if (ilbm.mask == 1)
n++;
plane[0] = malloc(((im->w + 15) / 16) * 2 * n);
if (!plane[0])
goto quit;
QUIT_WITH_RC(LOAD_OOM);
for (i = 1; i < n; i++)
plane[i] = plane[i - 1] + ((im->w + 15) / 16) * 2;
@ -554,10 +553,7 @@ load2(ImlibImage * im, int load_data)
ilbm.row++;
if (im->lc && __imlib_LoadProgressRows(im, y, 1))
{
rc = LOAD_BREAK;
goto quit;
}
QUIT_WITH_RC(LOAD_BREAK);
}
rc = LOAD_SUCCESS;
@ -574,8 +570,7 @@ load2(ImlibImage * im, int load_data)
freeilbm(&ilbm);
if (fdata != MAP_FAILED)
munmap(fdata, im->fsize);
munmap(fdata, im->fsize);
return rc;
}

View File

@ -41,7 +41,7 @@ load2(ImlibImage * im, int load_data)
fdata =
mmap(NULL, PNG_BYTES_TO_CHECK, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
if (fdata == MAP_FAILED)
return rc;
return LOAD_BADFILE;
ok = png_sig_cmp(fdata, 0, PNG_BYTES_TO_CHECK) == 0;
@ -58,11 +58,10 @@ load2(ImlibImage * im, int load_data)
if (!info_ptr)
goto quit;
rc = LOAD_BADIMAGE; /* Format accepted */
if (setjmp(png_jmpbuf(png_ptr)))
{
rc = LOAD_FAIL;
goto quit;
}
QUIT_WITH_RC(LOAD_BADIMAGE);
png_init_io(png_ptr, im->fp);
png_read_info(png_ptr, info_ptr);
@ -85,10 +84,7 @@ load2(ImlibImage * im, int load_data)
UPDATE_FLAG(im->flags, F_HAS_ALPHA, hasa);
if (!load_data)
{
rc = LOAD_SUCCESS;
goto quit;
}
QUIT_WITH_RC(LOAD_SUCCESS);
/* Load data */
@ -129,11 +125,11 @@ load2(ImlibImage * im, int load_data)
#endif
if (!__imlib_AllocateData(im))
goto quit;
QUIT_WITH_RC(LOAD_OOM);
pdata.lines = malloc(im->h * sizeof(unsigned char *));
if (!pdata.lines)
goto quit;
QUIT_WITH_RC(LOAD_OOM);
for (i = 0; i < im->h; i++)
pdata.lines[i] = (unsigned char *)(im->data + i * im->w);
@ -152,10 +148,7 @@ load2(ImlibImage * im, int load_data)
png_read_rows(png_ptr, &pdata.lines[y], NULL, nrows);
if (__imlib_LoadProgressRows(im, y, nrows))
{
rc = LOAD_BREAK;
goto quit1;
}
QUITx_WITH_RC(LOAD_BREAK, quit1);
}
}
}
@ -330,10 +323,7 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
png_write_rows(png_ptr, &row_ptr, 1);
if (im->lc && __imlib_LoadProgressRows(im, y, 1))
{
rc = LOAD_BREAK;
goto quit;
}
QUIT_WITH_RC(LOAD_BREAK);
ptr += im->w;
}

View File

@ -90,14 +90,12 @@ load2(ImlibImage * im, int load_data)
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
if (fdata == MAP_FAILED)
return rc;
return LOAD_BADFILE;
mm_init(fdata, im->fsize);
/* read the header info */
rc = LOAD_FAIL;
c = mm_getc();
if (c != 'P')
goto quit;
@ -163,6 +161,8 @@ load2(ImlibImage * im, int load_data)
if ((v < 0) || (v > 255))
goto quit;
rc = LOAD_BADIMAGE; /* Format accepted */
im->w = w;
im->h = h;
if (!IMAGE_DIMENSIONS_OK(w, h))
@ -171,16 +171,13 @@ load2(ImlibImage * im, int load_data)
UPDATE_FLAG(im->flags, F_HAS_ALPHA, p == '8');
if (!load_data)
{
rc = LOAD_SUCCESS;
goto quit;
}
QUIT_WITH_RC(LOAD_SUCCESS);
/* Load data */
ptr2 = __imlib_AllocateData(im);
if (!ptr2)
goto quit;
QUIT_WITH_RC(LOAD_OOM);
/* start reading the data */
switch (p)
@ -261,7 +258,7 @@ load2(ImlibImage * im, int load_data)
case '4': /* binary 1bit monochrome */
data = malloc((w + 7) / 8 * sizeof(DATA8));
if (!data)
goto quit;
QUIT_WITH_RC(LOAD_OOM);
ptr2 = im->data;
for (y = 0; y < h; y++)
@ -291,7 +288,7 @@ load2(ImlibImage * im, int load_data)
case '5': /* binary 8bit grayscale GGGGGGGG */
data = malloc(1 * sizeof(DATA8) * w);
if (!data)
goto quit;
QUIT_WITH_RC(LOAD_OOM);
ptr2 = im->data;
for (y = 0; y < h; y++)
@ -330,7 +327,7 @@ load2(ImlibImage * im, int load_data)
case '6': /* 24bit binary RGBRGBRGB */
data = malloc(3 * sizeof(DATA8) * w);
if (!data)
goto quit;
QUIT_WITH_RC(LOAD_OOM);
ptr2 = im->data;
for (y = 0; y < h; y++)
@ -369,7 +366,7 @@ load2(ImlibImage * im, int load_data)
case '7': /* XV's 8bit 332 format */
data = malloc(1 * sizeof(DATA8) * w);
if (!data)
goto quit;
QUIT_WITH_RC(LOAD_OOM);
ptr2 = im->data;
for (y = 0; y < h; y++)
@ -401,7 +398,7 @@ load2(ImlibImage * im, int load_data)
case '8': /* 24bit binary RGBARGBARGBA */
data = malloc(4 * sizeof(DATA8) * w);
if (!data)
goto quit;
QUIT_WITH_RC(LOAD_OOM);
ptr2 = im->data;
for (y = 0; y < h; y++)
@ -448,8 +445,7 @@ load2(ImlibImage * im, int load_data)
quit:
free(idata);
free(data);
if (fdata != MAP_FAILED)
munmap(fdata, im->fsize);
munmap(fdata, im->fsize);
if (rc == 0)
__imlib_FreeData(im);

View File

@ -132,10 +132,7 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
/* report progress every row */
if (im->lc && __imlib_LoadProgressRows(im, y, 1))
{
rc = LOAD_BREAK;
goto quit;
}
QUIT_WITH_RC(LOAD_BREAK);
}
/* write the header */
@ -181,15 +178,14 @@ load2(ImlibImage * im, int load_data)
unsigned int pix16;
rc = LOAD_FAIL;
fdata = MAP_FAILED;
if (im->fsize < (int)(sizeof(tga_header)) ||
(uintmax_t) im->fsize > SIZE_MAX)
goto quit;
return rc;
fdata = mmap(0, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
if (fdata == MAP_FAILED)
goto quit;
return LOAD_BADFILE;
fptr = fdata;
header = fdata;
@ -274,6 +270,8 @@ load2(ImlibImage * im, int load_data)
break;
}
rc = LOAD_BADIMAGE; /* Format accepted */
/* endian-safe loading of 16-bit sizes */
im->w = (header->widthHi << 8) | header->widthLo;
im->h = (header->heightHi << 8) | header->heightLo;
@ -287,10 +285,7 @@ load2(ImlibImage * im, int load_data)
UPDATE_FLAG(im->flags, F_HAS_ALPHA, hasa);
if (!load_data)
{
rc = LOAD_SUCCESS;
goto quit;
}
QUIT_WITH_RC(LOAD_SUCCESS);
/* find out how much data must be read from the file */
/* (this is NOT simply width*height*4, due to compression) */
@ -325,7 +320,7 @@ load2(ImlibImage * im, int load_data)
/* allocate the destination buffer */
if (!__imlib_AllocateData(im))
goto quit;
QUIT_WITH_RC(LOAD_OOM);
/* dataptr is the next 32-bit pixel to be filled in */
dataptr = im->data;
@ -565,8 +560,7 @@ load2(ImlibImage * im, int load_data)
quit:
if (rc <= 0)
__imlib_FreeData(im);
if (fdata != MAP_FAILED)
munmap(fdata, im->fsize);
munmap(fdata, im->fsize);
return rc;
}

View File

@ -257,7 +257,7 @@ load2(ImlibImage * im, int load_data)
fdata = mmap(NULL, TIFF_BYTES_TO_CHECK, PROT_READ, MAP_SHARED, fd, 0);
if (fdata == MAP_FAILED)
return rc;
return LOAD_BADFILE;
magic_number = *(uint16_t *) fdata;
@ -278,6 +278,8 @@ load2(ImlibImage * im, int load_data)
if (!TIFFRGBAImageOK(tif, txt))
goto quit;
rc = LOAD_BADIMAGE; /* Format accepted */
strcpy(txt, "Cannot begin reading tiff");
if (!TIFFRGBAImageBegin((TIFFRGBAImage *) & rgba_image, tif, 1, txt))
goto quit;
@ -315,21 +317,18 @@ load2(ImlibImage * im, int load_data)
rgba_image.rgba.alpha != EXTRASAMPLE_UNSPECIFIED);
if (!load_data)
{
rc = LOAD_SUCCESS;
goto quit;
}
QUIT_WITH_RC(LOAD_SUCCESS);
/* Load data */
if (!__imlib_AllocateData(im))
goto quit;
QUIT_WITH_RC(LOAD_OOM);
rast = _TIFFmalloc(sizeof(uint32_t) * im->w * im->h);
if (!rast)
{
fprintf(stderr, "imlib2-tiffloader: Out of memory\n");
goto quit;
QUIT_WITH_RC(LOAD_OOM);
}
if (rgba_image.rgba.isContig)
@ -490,10 +489,7 @@ save(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity)
goto quit;
if (im->lc && __imlib_LoadProgressRows(im, y, 1))
{
rc = LOAD_BREAK;
goto quit;
}
QUIT_WITH_RC(LOAD_BREAK);
}
rc = LOAD_SUCCESS;

View File

@ -22,9 +22,9 @@ load2(ImlibImage * im, int load_data)
if (im->fsize < 12)
return rc;
fdata = mmap(0, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
if (fdata == MAP_FAILED)
return rc;
return LOAD_BADFILE;
webp_data.bytes = fdata;
webp_data.size = im->fsize;
@ -34,6 +34,8 @@ load2(ImlibImage * im, int load_data)
if (!demux)
goto quit;
rc = LOAD_BADIMAGE; /* Format accepted */
frame = 1;
if (im->frame_num > 0)
{
@ -48,7 +50,7 @@ load2(ImlibImage * im, int load_data)
im->canvas_w, im->canvas_h, im->frame_count);
if (frame > 1 && frame > im->frame_count)
goto quit;
QUIT_WITH_RC(LOAD_BADFRAME);
}
if (!WebPDemuxGetFrame(demux, frame, &iter))
@ -77,15 +79,12 @@ load2(ImlibImage * im, int load_data)
UPDATE_FLAG(im->flags, F_HAS_ALPHA, iter.has_alpha);
if (!load_data)
{
rc = LOAD_SUCCESS;
goto quit;
}
QUIT_WITH_RC(LOAD_SUCCESS);
/* Load data */
if (!__imlib_AllocateData(im))
goto quit;
QUIT_WITH_RC(LOAD_OOM);
if (WebPDecodeBGRAInto
(iter.fragment.bytes, iter.fragment.size, (uint8_t *) im->data,
@ -102,8 +101,7 @@ load2(ImlibImage * im, int load_data)
__imlib_FreeData(im);
if (demux)
WebPDemuxDelete(demux);
if (fdata != MAP_FAILED)
munmap(fdata, im->fsize);
munmap(fdata, im->fsize);
return rc;
}

View File

@ -98,7 +98,7 @@ load2(ImlibImage * im, int load_data)
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
if (fdata == MAP_FAILED)
return rc;
return LOAD_BADFILE;
/* Signature check ("#define") allow longish initial comment */
s = fdata;
@ -151,18 +151,17 @@ load2(ImlibImage * im, int load_data)
goto quit;
if (!load_data)
{
rc = LOAD_SUCCESS;
goto quit;
}
QUIT_WITH_RC(LOAD_SUCCESS);
UNSET_FLAG(im->flags, F_HAS_ALPHA);
header = 0;
rc = LOAD_BADIMAGE; /* Format accepted */
ptr = __imlib_AllocateData(im);
if (!ptr)
goto quit;
QUIT_WITH_RC(LOAD_OOM);
}
else
{
@ -194,10 +193,7 @@ load2(ImlibImage * im, int load_data)
if (x >= im->w)
{
if (im->lc && __imlib_LoadProgressRows(im, y, 1))
{
rc = LOAD_BREAK;
goto quit;
}
QUIT_WITH_RC(LOAD_BREAK);
x = 0;
y += 1;
@ -214,8 +210,7 @@ load2(ImlibImage * im, int load_data)
quit:
if (rc <= 0)
__imlib_FreeData(im);
if (fdata != MAP_FAILED)
munmap(fdata, im->fsize);
munmap(fdata, im->fsize);
return rc;
}

View File

@ -175,11 +175,13 @@ load2(ImlibImage * im, int load_data)
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
if (fdata == MAP_FAILED)
return rc;
return LOAD_BADFILE;
if (!memmem(fdata, im->fsize, " XPM */", 7))
goto quit;
rc = LOAD_BADIMAGE; /* Format accepted */
mm_init(fdata, im->fsize);
j = 0;
@ -196,7 +198,7 @@ load2(ImlibImage * im, int load_data)
count = 0;
line = malloc(lsz);
if (!line)
goto quit;
QUIT_WITH_RC(LOAD_OOM);
len = 0;
backslash = 0;
@ -256,7 +258,7 @@ load2(ImlibImage * im, int load_data)
cmap = calloc(ncolors, sizeof(cmap_t));
if (!cmap)
goto quit;
QUIT_WITH_RC(LOAD_OOM);
pixels = w * h;
@ -363,14 +365,11 @@ load2(ImlibImage * im, int load_data)
UPDATE_FLAG(im->flags, F_HAS_ALPHA, transp >= 0);
if (!load_data)
{
rc = LOAD_SUCCESS;
goto quit;
}
QUIT_WITH_RC(LOAD_SUCCESS);
ptr = __imlib_AllocateData(im);
if (!ptr)
goto quit;
QUIT_WITH_RC(LOAD_OOM);
}
}
else
@ -410,10 +409,8 @@ load2(ImlibImage * im, int load_data)
if (im->lc && i > last_row)
{
if (__imlib_LoadProgressRows(im, last_row, i - last_row))
{
rc = LOAD_BREAK;
goto quit;
}
QUIT_WITH_RC(LOAD_BREAK);
last_row = i;
}
}
@ -451,7 +448,7 @@ load2(ImlibImage * im, int load_data)
lsz += 256;
nline = realloc(line, lsz);
if (!nline)
goto quit;
QUIT_WITH_RC(LOAD_OOM);
line = nline;
}
@ -477,8 +474,7 @@ load2(ImlibImage * im, int load_data)
xpm_parse_done();
if (fdata != MAP_FAILED)
munmap(fdata, im->fsize);
munmap(fdata, im->fsize);
return rc;
}

View File

@ -38,12 +38,15 @@ uncompress_file(FILE * fp, int dest)
int
load2(ImlibImage * im, int load_data)
{
int rc;
ImlibLoader *loader;
int dest, res;
const char *s, *p, *q;
char tmp[] = "/tmp/imlib2_loader_zlib-XXXXXX";
char *real_ext;
rc = LOAD_FAIL;
/* make sure this file ends in ".gz" and that there's another ext
* (e.g. "foo.png.gz") */
for (p = s = im->real_file, q = NULL; *s; s++)
@ -54,18 +57,18 @@ load2(ImlibImage * im, int load_data)
p = s + 1;
}
if (!q || strcasecmp(p, "gz"))
return 0;
return rc;
if (!(real_ext = strndup(q, p - q - 1)))
return 0;
return rc;
loader = __imlib_FindBestLoaderForFormat(real_ext, 0);
free(real_ext);
if (!loader)
return 0;
return rc;
if ((dest = mkstemp(tmp)) < 0)
return 0;
return rc;
res = uncompress_file(im->fp, dest);
close(dest);