diff options
author | Kim Woelders <kim@woelders.dk> | 2021-09-16 09:36:05 +0200 |
---|---|---|
committer | Kim Woelders <kim@woelders.dk> | 2021-12-28 16:08:06 +0100 |
commit | bf93574b8bd2eb315bf1a76dce6e5730eebd2018 (patch) | |
tree | a896456eae7494de57f84d7f90c01f28f5c4a60e | |
parent | f3db9c99b687030634f9f89818eb9c7361718e77 (diff) | |
download | imlib2-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.in | 4 | ||||
-rw-r--r-- | src/lib/image.c | 51 | ||||
-rw-r--r-- | src/lib/image.h | 10 | ||||
-rw-r--r-- | src/modules/loaders/loader_argb.c | 27 | ||||
-rw-r--r-- | src/modules/loaders/loader_bmp.c | 54 | ||||
-rw-r--r-- | src/modules/loaders/loader_bz2.c | 11 | ||||
-rw-r--r-- | src/modules/loaders/loader_common.h | 3 | ||||
-rw-r--r-- | src/modules/loaders/loader_ff.c | 24 | ||||
-rw-r--r-- | src/modules/loaders/loader_gif.c | 24 | ||||
-rw-r--r-- | src/modules/loaders/loader_ico.c | 9 | ||||
-rw-r--r-- | src/modules/loaders/loader_id3.c | 28 | ||||
-rw-r--r-- | src/modules/loaders/loader_jpeg.c | 27 | ||||
-rw-r--r-- | src/modules/loaders/loader_lbm.c | 29 | ||||
-rw-r--r-- | src/modules/loaders/loader_png.c | 28 | ||||
-rw-r--r-- | src/modules/loaders/loader_pnm.c | 26 | ||||
-rw-r--r-- | src/modules/loaders/loader_tga.c | 24 | ||||
-rw-r--r-- | src/modules/loaders/loader_tiff.c | 18 | ||||
-rw-r--r-- | src/modules/loaders/loader_webp.c | 18 | ||||
-rw-r--r-- | src/modules/loaders/loader_xbm.c | 19 | ||||
-rw-r--r-- | src/modules/loaders/loader_xpm.c | 26 | ||||
-rw-r--r-- | src/modules/loaders/loader_zlib.c | 11 |
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); |