summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKim Woelders <kim@woelders.dk>2021-09-16 09:36:05 +0200
committerKim Woelders <kim@woelders.dk>2021-12-28 16:08:06 +0100
commitbf93574b8bd2eb315bf1a76dce6e5730eebd2018 (patch)
treea896456eae7494de57f84d7f90c01f28f5c4a60e
parentf3db9c99b687030634f9f89818eb9c7361718e77 (diff)
downloadimlib2-bf93574b8bd2eb315bf1a76dce6e5730eebd2018.tar.gz
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.
-rw-r--r--src/lib/Imlib2.h.in4
-rw-r--r--src/lib/image.c51
-rw-r--r--src/lib/image.h10
-rw-r--r--src/modules/loaders/loader_argb.c27
-rw-r--r--src/modules/loaders/loader_bmp.c54
-rw-r--r--src/modules/loaders/loader_bz2.c11
-rw-r--r--src/modules/loaders/loader_common.h3
-rw-r--r--src/modules/loaders/loader_ff.c24
-rw-r--r--src/modules/loaders/loader_gif.c24
-rw-r--r--src/modules/loaders/loader_ico.c9
-rw-r--r--src/modules/loaders/loader_id3.c28
-rw-r--r--src/modules/loaders/loader_jpeg.c27
-rw-r--r--src/modules/loaders/loader_lbm.c29
-rw-r--r--src/modules/loaders/loader_png.c28
-rw-r--r--src/modules/loaders/loader_pnm.c26
-rw-r--r--src/modules/loaders/loader_tga.c24
-rw-r--r--src/modules/loaders/loader_tiff.c18
-rw-r--r--src/modules/loaders/loader_webp.c18
-rw-r--r--src/modules/loaders/loader_xbm.c19
-rw-r--r--src/modules/loaders/loader_xpm.c26
-rw-r--r--src/modules/loaders/loader_zlib.c11
21 files changed, 217 insertions, 254 deletions
diff --git a/src/lib/Imlib2.h.in b/src/lib/Imlib2.h.in
index b901ca4..0e465c5 100644
--- a/src/lib/Imlib2.h.in
+++ b/src/lib/Imlib2.h.in
@@ -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) */
diff --git a/src/lib/image.c b/src/lib/image.c
index 57ffcb7..fb4e82f 100644
--- a/src/lib/image.c
+++ b/src/lib/image.c
@@ -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;
}
diff --git a/src/lib/image.h b/src/lib/image.h
index 904b1bd..daaac57 100644
--- a/src/lib/image.h
+++ b/src/lib/image.h
@@ -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 */
diff --git a/src/modules/loaders/loader_argb.c b/src/modules/loaders/loader_argb.c
index 7ad292f..234ac80 100644
--- a/src/modules/loaders/loader_argb.c
+++ b/src/modules/loaders/loader_argb.c
@@ -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;
diff --git a/src/modules/loaders/loader_bmp.c b/src/modules/loaders/loader_bmp.c
index 21e07a0..9afdec6 100644
--- a/src/modules/loaders/loader_bmp.c
+++ b/src/modules/loaders/loader_bmp.c
@@ -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;
}
diff --git a/src/modules/loaders/loader_bz2.c b/src/modules/loaders/loader_bz2.c
index b7d1d4e..66575bc 100644
--- a/src/modules/loaders/loader_bz2.c
+++ b/src/modules/loaders/loader_bz2.c
@@ -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);
diff --git a/src/modules/loaders/loader_common.h b/src/modules/loaders/loader_common.h
index 512ade8..9d0dc71 100644
--- a/src/modules/loaders/loader_common.h
+++ b/src/modules/loaders/loader_common.h
@@ -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 */
diff --git a/src/modules/loaders/loader_ff.c b/src/modules/loaders/loader_ff.c
index a69165e..d9a9e52 100644
--- a/src/modules/loaders/loader_ff.c
+++ b/src/modules/loaders/loader_ff.c
@@ -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;
diff --git a/src/modules/loaders/loader_gif.c b/src/modules/loaders/loader_gif.c
index 376aee2..6bd31ff 100644
--- a/src/modules/loaders/loader_gif.c
+++ b/src/modules/loaders/loader_gif.c
@@ -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)
diff --git a/src/modules/loaders/loader_ico.c b/src/modules/loaders/loader_ico.c
index b957953..e8cef41 100644
--- a/src/modules/loaders/loader_ico.c
+++ b/src/modules/loaders/loader_ico.c
@@ -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;
}
diff --git a/src/modules/loaders/loader_id3.c b/src/modules/loaders/loader_id3.c
index 6be0ccc..31b5f37 100644
--- a/src/modules/loaders/loader_id3.c
+++ b/src/modules/loaders/loader_id3.c
@@ -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
diff --git a/src/modules/loaders/loader_jpeg.c b/src/modules/loaders/loader_jpeg.c
index ecfc775..02be9f9 100644
--- a/src/modules/loaders/loader_jpeg.c
+++ b/src/modules/loaders/loader_jpeg.c
@@ -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;
diff --git a/src/modules/loaders/loader_lbm.c b/src/modules/loaders/loader_lbm.c
index e0f4a64..bdff90f 100644
--- a/src/modules/loaders/loader_lbm.c
+++ b/src/modules/loaders/loader_lbm.c
@@ -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;
}
diff --git a/src/modules/loaders/loader_png.c b/src/modules/loaders/loader_png.c
index ecfad61..0735274 100644
--- a/src/modules/loaders/loader_png.c
+++ b/src/modules/loaders/loader_png.c
@@ -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;
}
diff --git a/src/modules/loaders/loader_pnm.c b/src/modules/loaders/loader_pnm.c
index d0b9630..93a5eaa 100644
--- a/src/modules/loaders/loader_pnm.c
+++ b/src/modules/loaders/loader_pnm.c
@@ -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);
diff --git a/src/modules/loaders/loader_tga.c b/src/modules/loaders/loader_tga.c
index eab9a3c..0aea49b 100644
--- a/src/modules/loaders/loader_tga.c
+++ b/src/modules/loaders/loader_tga.c
@@ -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;
}
diff --git a/src/modules/loaders/loader_tiff.c b/src/modules/loaders/loader_tiff.c
index a2d06c6..cd99f99 100644
--- a/src/modules/loaders/loader_tiff.c
+++ b/src/modules/loaders/loader_tiff.c
@@ -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;
diff --git a/src/modules/loaders/loader_webp.c b/src/modules/loaders/loader_webp.c
index 7243172..f2286d1 100644
--- a/src/modules/loaders/loader_webp.c
+++ b/src/modules/loaders/loader_webp.c
@@ -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;
}
diff --git a/src/modules/loaders/loader_xbm.c b/src/modules/loaders/loader_xbm.c
index 22f4832..b240f11 100644
--- a/src/modules/loaders/loader_xbm.c
+++ b/src/modules/loaders/loader_xbm.c
@@ -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;
}
diff --git a/src/modules/loaders/loader_xpm.c b/src/modules/loaders/loader_xpm.c
index e275b73..a17f56d 100644
--- a/src/modules/loaders/loader_xpm.c
+++ b/src/modules/loaders/loader_xpm.c
@@ -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;
}
diff --git a/src/modules/loaders/loader_zlib.c b/src/modules/loaders/loader_zlib.c
index 2beccef..0b98250 100644
--- a/src/modules/loaders/loader_zlib.c
+++ b/src/modules/loaders/loader_zlib.c
@@ -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);