kwo pushed a commit to branch master.

http://git.enlightenment.org/legacy/imlib2.git/commit/?id=bf93574b8bd2eb315bf1a76dce6e5730eebd2018

commit bf93574b8bd2eb315bf1a76dce6e5730eebd2018
Author: Kim Woelders <k...@woelders.dk>
Date:   Thu Sep 16 09:36:05 2021 +0200

    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.
---
 src/lib/Imlib2.h.in                 |  4 ++-
 src/lib/image.c                     | 51 ++++++++++++++++++++++++++++-------
 src/lib/image.h                     | 10 ++++---
 src/modules/loaders/loader_argb.c   | 27 ++++++++-----------
 src/modules/loaders/loader_bmp.c    | 54 ++++++++++---------------------------
 src/modules/loaders/loader_bz2.c    | 11 +++++---
 src/modules/loaders/loader_common.h |  3 +++
 src/modules/loaders/loader_ff.c     | 24 ++++++-----------
 src/modules/loaders/loader_gif.c    | 24 ++++++++---------
 src/modules/loaders/loader_ico.c    |  9 ++++---
 src/modules/loaders/loader_id3.c    | 28 ++++++++++---------
 src/modules/loaders/loader_jpeg.c   | 27 +++++++------------
 src/modules/loaders/loader_lbm.c    | 29 +++++++++-----------
 src/modules/loaders/loader_png.c    | 28 +++++++------------
 src/modules/loaders/loader_pnm.c    | 26 ++++++++----------
 src/modules/loaders/loader_tga.c    | 24 +++++++----------
 src/modules/loaders/loader_tiff.c   | 18 +++++--------
 src/modules/loaders/loader_webp.c   | 18 ++++++-------
 src/modules/loaders/loader_xbm.c    | 19 +++++--------
 src/modules/loaders/loader_xpm.c    | 26 ++++++++----------
 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);

-- 


Reply via email to