This is an automated email from the git hooks/post-receive script.

git pushed a commit to branch master
in repository legacy-imlib2.

View the commit online.

commit 753065d5a3eeddc6851f35193bf1613709a53412
Author: Kim Woelders <[email protected]>
AuthorDate: Mon Mar 28 14:23:18 2022 +0200

    loading: Centralize mmap handling
    
    Loader interface should be stable now.
---
 src/lib/Imlib2_Loader.h               |  2 +-
 src/lib/image.c                       | 13 +++++++++++++
 src/lib/image.h                       |  1 +
 src/modules/loaders/decompress_load.c |  9 +--------
 src/modules/loaders/loader_argb.c     | 12 ++----------
 src/modules/loaders/loader_bmp.c      | 12 ++----------
 src/modules/loaders/loader_ff.c       | 12 ++----------
 src/modules/loaders/loader_gif.c      | 10 +---------
 src/modules/loaders/loader_heif.c     | 12 ++----------
 src/modules/loaders/loader_ico.c      |  9 +--------
 src/modules/loaders/loader_id3.c      |  3 +++
 src/modules/loaders/loader_j2k.c      | 15 ++++-----------
 src/modules/loaders/loader_jpeg.c     |  9 +--------
 src/modules/loaders/loader_jxl.c      | 11 ++---------
 src/modules/loaders/loader_lbm.c      | 10 +---------
 src/modules/loaders/loader_png.c      | 26 +++++++++++---------------
 src/modules/loaders/loader_pnm.c      |  9 +--------
 src/modules/loaders/loader_ps.c       |  9 +--------
 src/modules/loaders/loader_svg.c      | 12 ++----------
 src/modules/loaders/loader_tga.c      | 12 ++----------
 src/modules/loaders/loader_tiff.c     | 11 ++---------
 src/modules/loaders/loader_webp.c     |  9 +--------
 src/modules/loaders/loader_xbm.c      | 12 ++----------
 src/modules/loaders/loader_xpm.c      | 13 +++----------
 24 files changed, 62 insertions(+), 191 deletions(-)

diff --git a/src/lib/Imlib2_Loader.h b/src/lib/Imlib2_Loader.h
index 4dccfdc..5f826d0 100644
--- a/src/lib/Imlib2_Loader.h
+++ b/src/lib/Imlib2_Loader.h
@@ -10,7 +10,6 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
-#include <sys/mman.h>
 
 /* types.h */
 
@@ -118,6 +117,7 @@ typedef struct _ImlibImageFileInfo {
    struct _ImlibImageFileInfo *next;
    char               *name;
    FILE               *fp;
+   const void         *fdata;
    off_t               fsize;
 } ImlibImageFileInfo;
 
diff --git a/src/lib/image.c b/src/lib/image.c
index a7844b2..225566f 100644
--- a/src/lib/image.c
+++ b/src/lib/image.c
@@ -9,6 +9,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <time.h>
+#include <sys/mman.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 
@@ -78,6 +79,7 @@ static int
 __imlib_FileContextOpen(ImlibImageFileInfo * fi, FILE * fp, off_t fsize)
 {
    struct stat         st;
+   void               *fdata;
 
    if (fp)
      {
@@ -101,6 +103,12 @@ __imlib_FileContextOpen(ImlibImageFileInfo * fi, FILE * fp, off_t fsize)
         fi->fsize = fsize;
      }
 
+   fdata = mmap(NULL, fi->fsize, PROT_READ, MAP_SHARED, fileno(fi->fp), 0);
+   if (fdata == MAP_FAILED)
+      return -1;
+
+   fi->fdata = fdata;
+
    return 0;
 }
 
@@ -109,6 +117,11 @@ __imlib_FileContextClose(ImlibImageFileInfo * fi)
 {
    if (!fi->keep_fp)
      {
+        if (fi->fdata)
+          {
+             munmap((void *)fi->fdata, fi->fsize);
+             fi->fdata = NULL;
+          }
         if (fi->fp)
           {
              fclose(fi->fp);
diff --git a/src/lib/image.h b/src/lib/image.h
index b2dee40..41983f6 100644
--- a/src/lib/image.h
+++ b/src/lib/image.h
@@ -30,6 +30,7 @@ typedef struct _ImlibImageFileInfo {
    struct _ImlibImageFileInfo *next;
    char               *name;
    FILE               *fp;
+   const void         *fdata;
    off_t               fsize;
    /* vvv Private vvv */
    char                keep_fp;
diff --git a/src/modules/loaders/decompress_load.c b/src/modules/loaders/decompress_load.c
index a65a977..10238da 100644
--- a/src/modules/loaders/decompress_load.c
+++ b/src/modules/loaders/decompress_load.c
@@ -11,7 +11,6 @@ decompress_load(ImlibImage * im, int load_data, const char *const *pext,
    const char         *s, *p, *q;
    char                tmp[] = "/tmp/imlib2_loader_dec-XXXXXX";
    char               *real_ext;
-   void               *fdata;
 
    rc = LOAD_FAIL;
 
@@ -47,15 +46,10 @@ decompress_load(ImlibImage * im, int load_data, const char *const *pext,
    if (!loader)
       return rc;
 
-   fdata =
-      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
-   if (fdata == MAP_FAILED)
-      return LOAD_BADFILE;
-
    if ((dest = mkstemp(tmp)) < 0)
       QUIT_WITH_RC(LOAD_OOM);
 
-   res = fdec(fdata, im->fi->fsize, dest);
+   res = fdec(im->fi->fdata, im->fi->fsize, dest);
 
    close(dest);
 
@@ -65,7 +59,6 @@ decompress_load(ImlibImage * im, int load_data, const char *const *pext,
    unlink(tmp);
 
  quit:
-   munmap(fdata, im->fi->fsize);
 
    return rc;
 }
diff --git a/src/modules/loaders/loader_argb.c b/src/modules/loaders/loader_argb.c
index f54061e..fe70ea7 100644
--- a/src/modules/loaders/loader_argb.c
+++ b/src/modules/loaders/loader_argb.c
@@ -37,7 +37,6 @@ static int
 _load(ImlibImage * im, int load_data)
 {
    int                 rc;
-   void               *fdata;
    int                 alpha;
    uint32_t           *ptr;
    int                 y;
@@ -50,16 +49,11 @@ _load(ImlibImage * im, int load_data)
 
    rc = LOAD_FAIL;
 
-   fdata =
-      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
-   if (fdata == MAP_FAILED)
-      return LOAD_BADFILE;
-
-   mm_init(fdata, im->fi->fsize);
+   mm_init(im->fi->fdata, im->fi->fsize);
 
    /* header */
 
-   fptr = fdata;
+   fptr = im->fi->fdata;
    size = im->fi->fsize > 31 ? 31 : im->fi->fsize;      /* Look for \n in at most 31 byte */
    row = memchr(fptr, '\n', size);
    if (!row)
@@ -108,8 +102,6 @@ _load(ImlibImage * im, int load_data)
    rc = LOAD_SUCCESS;
 
  quit:
-   munmap(fdata, im->fi->fsize);
-
    return rc;
 }
 
diff --git a/src/modules/loaders/loader_bmp.c b/src/modules/loaders/loader_bmp.c
index 86378f3..9838fdd 100644
--- a/src/modules/loaders/loader_bmp.c
+++ b/src/modules/loaders/loader_bmp.c
@@ -158,7 +158,6 @@ static int
 _load(ImlibImage * im, int load_data)
 {
    int                 rc;
-   void               *fdata;
    const unsigned char *fptr;
    bfh_t               bfh;
    unsigned int        bfh_offset;
@@ -179,13 +178,8 @@ _load(ImlibImage * im, int load_data)
 
    rc = LOAD_FAIL;
 
-   fdata =
-      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
-   if (fdata == MAP_FAILED)
-      return LOAD_BADFILE;
-
-   fptr = fdata;
-   mm_init(fdata, im->fi->fsize);
+   fptr = im->fi->fdata;
+   mm_init(im->fi->fdata, im->fi->fsize);
 
    /* Load header */
 
@@ -760,8 +754,6 @@ _load(ImlibImage * im, int load_data)
    rc = LOAD_SUCCESS;
 
  quit:
-   munmap(fdata, im->fi->fsize);
-
    return rc;
 }
 
diff --git a/src/modules/loaders/loader_ff.c b/src/modules/loaders/loader_ff.c
index c9f6591..aaacadb 100644
--- a/src/modules/loaders/loader_ff.c
+++ b/src/modules/loaders/loader_ff.c
@@ -6,7 +6,7 @@
 
 static const char  *const _formats[] = { "ff" };
 
-#define mm_check(p) ((const char *)(p) <= (const char *)fdata + im->fi->fsize)
+#define mm_check(p) ((const char *)(p) <= (const char *)im->fi->fdata + im->fi->fsize)
 
 typedef struct {
    unsigned char       magic[8];
@@ -17,7 +17,6 @@ static int
 _load(ImlibImage * im, int load_data)
 {
    int                 rc;
-   void               *fdata;
    int                 rowlen, i, j;
    const ff_hdr_t     *hdr;
    const uint16_t     *row;
@@ -28,13 +27,8 @@ _load(ImlibImage * im, int load_data)
    if (im->fi->fsize < (long)sizeof(ff_hdr_t))
       return rc;
 
-   fdata =
-      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
-   if (fdata == MAP_FAILED)
-      return LOAD_BADFILE;
-
    /* read and check the header */
-   hdr = fdata;
+   hdr = im->fi->fdata;
    if (memcmp("farbfeld", hdr->magic, sizeof(hdr->magic)))
       goto quit;
 
@@ -83,8 +77,6 @@ _load(ImlibImage * im, int load_data)
    rc = LOAD_SUCCESS;
 
  quit:
-   munmap(fdata, im->fi->fsize);
-
    return rc;
 }
 
diff --git a/src/modules/loaders/loader_gif.c b/src/modules/loaders/loader_gif.c
index a152e77..1ccba8b 100644
--- a/src/modules/loaders/loader_gif.c
+++ b/src/modules/loaders/loader_gif.c
@@ -57,7 +57,6 @@ static int
 _load(ImlibImage * im, int load_data)
 {
    int                 rc, err;
-   void               *fdata;
    uint32_t           *ptr;
    GifFileType        *gif;
    GifRowType         *rows;
@@ -68,15 +67,10 @@ _load(ImlibImage * im, int load_data)
    uint32_t            colormap[256];
    int                 fcount, frame, multiframe;
 
-   fdata =
-      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
-   if (fdata == MAP_FAILED)
-      return LOAD_BADFILE;
-
    rc = LOAD_FAIL;
    rows = NULL;
 
-   mm_init(fdata, im->fi->fsize);
+   mm_init(im->fi->fdata, im->fi->fsize);
 
 #if GIFLIB_MAJOR >= 5
    gif = DGifOpen(NULL, mm_read, &err);
@@ -302,8 +296,6 @@ _load(ImlibImage * im, int load_data)
    DGifCloseFile(gif);
 #endif
 
-   munmap(fdata, im->fi->fsize);
-
    return rc;
 }
 
diff --git a/src/modules/loaders/loader_heif.c b/src/modules/loaders/loader_heif.c
index 86bf3db..4a4742f 100644
--- a/src/modules/loaders/loader_heif.c
+++ b/src/modules/loaders/loader_heif.c
@@ -20,7 +20,6 @@ static int
 _load(ImlibImage * im, int load_data)
 {
    int                 rc;
-   void               *fdata;
    int                 img_has_alpha;
    int                 stride = 0;
    int                 bytes_per_px;
@@ -39,13 +38,8 @@ _load(ImlibImage * im, int load_data)
    if (im->fi->fsize < HEIF_BYTES_TO_CHECK)
       return rc;
 
-   fdata =
-      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
-   if (fdata == MAP_FAILED)
-      return LOAD_BADFILE;
-
    /* check signature */
-   switch (heif_check_filetype(fdata, im->fi->fsize))
+   switch (heif_check_filetype(im->fi->fdata, im->fi->fsize))
      {
      case heif_filetype_no:
      case heif_filetype_yes_unsupported:
@@ -62,7 +56,7 @@ _load(ImlibImage * im, int load_data)
    if (!ctx)
       goto quit;
 
-   error = heif_context_read_from_memory_without_copy(ctx, fdata,
+   error = heif_context_read_from_memory_without_copy(ctx, im->fi->fdata,
                                                       im->fi->fsize, NULL);
    if (error.code != heif_error_Ok)
       goto quit;
@@ -156,8 +150,6 @@ _load(ImlibImage * im, int load_data)
    heif_context_free(ctx);
    heif_decoding_options_free(decode_opts);
 
-   munmap(fdata, im->fi->fsize);
-
    return rc;
 }
 
diff --git a/src/modules/loaders/loader_ico.c b/src/modules/loaders/loader_ico.c
index 20c8666..461d5de 100644
--- a/src/modules/loaders/loader_ico.c
+++ b/src/modules/loaders/loader_ico.c
@@ -396,18 +396,12 @@ static int
 _load(ImlibImage * im, int load_data)
 {
    int                 rc;
-   void               *fdata;
    ico_t               ico;
    unsigned int        i;
 
    rc = LOAD_FAIL;
 
-   fdata =
-      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
-   if (fdata == MAP_FAILED)
-      return LOAD_BADFILE;
-
-   mm_init(fdata, im->fi->fsize);
+   mm_init(im->fi->fdata, im->fi->fsize);
 
    ico.ie = NULL;
    if (mm_read(&ico.idir, sizeof(ico.idir)))
@@ -444,7 +438,6 @@ _load(ImlibImage * im, int load_data)
 
  quit:
    ico_delete(&ico);
-   munmap(fdata, im->fi->fsize);
 
    return rc;
 }
diff --git a/src/modules/loaders/loader_id3.c b/src/modules/loaders/loader_id3.c
index dcc54c1..2d0a14c 100644
--- a/src/modules/loaders/loader_id3.c
+++ b/src/modules/loaders/loader_id3.c
@@ -500,6 +500,9 @@ _load(ImlibImage * im, int load_data)
    rc = LOAD_FAIL;
    opt.ctx = NULL;
 
+   if (!im->fi->fp)
+      return rc;
+
    if (!get_options(&opt, im))
       goto quit;
 
diff --git a/src/modules/loaders/loader_j2k.c b/src/modules/loaders/loader_j2k.c
index 4fa78bd..30385ef 100644
--- a/src/modules/loaders/loader_j2k.c
+++ b/src/modules/loaders/loader_j2k.c
@@ -96,7 +96,6 @@ static int
 _load(ImlibImage * im, int load_data)
 {
    int                 rc;
-   void               *fdata;
    int                 ok;
    opj_dparameters_t   jparam;
    opj_codec_t        *jcodec;
@@ -108,11 +107,6 @@ _load(ImlibImage * im, int load_data)
    OPJ_INT32          *pa, *pr, *pg, *pb;
    unsigned char       a, r, g, b;
 
-   fdata =
-      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
-   if (fdata == MAP_FAILED)
-      return LOAD_BADFILE;
-
    rc = LOAD_FAIL;
    jcodec = NULL;
    jstream = NULL;
@@ -122,10 +116,10 @@ _load(ImlibImage * im, int load_data)
    if (im->fi->fsize < 12)
       goto quit;
 
-   if (memcmp(fdata, JP2_MAGIC, 4) == 0 ||
-       memcmp(fdata, JP2_RFC3745_MAGIC, 12) == 0)
+   if (memcmp(im->fi->fdata, JP2_MAGIC, 4) == 0 ||
+       memcmp(im->fi->fdata, JP2_RFC3745_MAGIC, 12) == 0)
       jfmt = OPJ_CODEC_JP2;
-   else if (memcmp(fdata, J2K_CODESTREAM_MAGIC, 4) == 0)
+   else if (memcmp(im->fi->fdata, J2K_CODESTREAM_MAGIC, 4) == 0)
       jfmt = OPJ_CODEC_J2K;
    else
       goto quit;
@@ -164,7 +158,7 @@ _load(ImlibImage * im, int load_data)
         if (!jstream)
            goto quit;
 
-        mm_init(fdata, im->fi->fsize);
+        mm_init(im->fi->fdata, im->fi->fsize);
         opj_stream_set_user_data(jstream, &mdata, NULL);
         opj_stream_set_user_data_length(jstream, im->fi->fsize);
         opj_stream_set_read_function(jstream, mm_read);
@@ -275,7 +269,6 @@ _load(ImlibImage * im, int load_data)
       opj_stream_destroy(jstream);
    if (jcodec)
       opj_destroy_codec(jcodec);
-   munmap(fdata, im->fi->fsize);
 
    return rc;
 }
diff --git a/src/modules/loaders/loader_jpeg.c b/src/modules/loaders/loader_jpeg.c
index 5faa648..1fb263a 100644
--- a/src/modules/loaders/loader_jpeg.c
+++ b/src/modules/loaders/loader_jpeg.c
@@ -68,7 +68,6 @@ static int
 _load(ImlibImage * im, int load_data)
 {
    int                 w, h, rc;
-   void               *fdata;
    struct jpeg_decompress_struct jds;
    ImLib_JPEG_data     jdata;
    uint8_t            *ptr, *line[16];
@@ -78,18 +77,13 @@ _load(ImlibImage * im, int load_data)
 
    rc = LOAD_FAIL;
 
-   fdata =
-      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
-   if (fdata == MAP_FAILED)
-      return rc;
-
    /* set up error handling */
    jds.err = _jdata_init(&jdata);
    if (sigsetjmp(jdata.setjmp_buffer, 1))
       QUIT_WITH_RC(LOAD_FAIL);
 
    jpeg_create_decompress(&jds);
-   jpeg_mem_src(&jds, fdata, im->fi->fsize);
+   jpeg_mem_src(&jds, im->fi->fdata, im->fi->fsize);
    jpeg_save_markers(&jds, JPEG_APP0 + 1, 256);
    jpeg_read_header(&jds, TRUE);
 
@@ -252,7 +246,6 @@ _load(ImlibImage * im, int load_data)
  quit:
    jpeg_destroy_decompress(&jds);
    free(jdata.data);
-   munmap(fdata, im->fi->fsize);
 
    return rc;
 }
diff --git a/src/modules/loaders/loader_jxl.c b/src/modules/loaders/loader_jxl.c
index 2fc4bee..7ddeaf3 100644
--- a/src/modules/loaders/loader_jxl.c
+++ b/src/modules/loaders/loader_jxl.c
@@ -43,7 +43,6 @@ _load(ImlibImage * im, int load_data)
    };
 
    int                 rc;
-   void               *fdata;
    JxlDecoderStatus    jst;
    JxlDecoder         *dec;
    JxlBasicInfo        info;
@@ -55,15 +54,10 @@ _load(ImlibImage * im, int load_data)
    JxlParallelRunner  *runner = NULL;
 #endif
 
-   fdata =
-      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
-   if (fdata == MAP_FAILED)
-      return LOAD_BADFILE;
-
    rc = LOAD_FAIL;
    dec = NULL;
 
-   switch (JxlSignatureCheck(fdata, 128))
+   switch (JxlSignatureCheck(im->fi->fdata, 128))
      {
      default:
 //   case JXL_SIG_NOT_ENOUGH_BYTES:
@@ -101,7 +95,7 @@ _load(ImlibImage * im, int load_data)
    if (jst != JXL_DEC_SUCCESS)
       goto quit;
 
-   jst = JxlDecoderSetInput(dec, fdata, im->fi->fsize);
+   jst = JxlDecoderSetInput(dec, im->fi->fdata, im->fi->fsize);
    if (jst != JXL_DEC_SUCCESS)
       goto quit;
 
@@ -214,7 +208,6 @@ _load(ImlibImage * im, int load_data)
 #endif
    if (dec)
       JxlDecoderDestroy(dec);
-   munmap(fdata, im->fi->fsize);
 
    return rc;
 }
diff --git a/src/modules/loaders/loader_lbm.c b/src/modules/loaders/loader_lbm.c
index 2f72d0c..1f50ba8 100644
--- a/src/modules/loaders/loader_lbm.c
+++ b/src/modules/loaders/loader_lbm.c
@@ -443,7 +443,6 @@ static int
 _load(ImlibImage * im, int load_data)
 {
    int                 rc;
-   void               *fdata;
    char               *env;
    int                 i, n, y, z;
    unsigned char      *plane[40];
@@ -451,11 +450,6 @@ _load(ImlibImage * im, int load_data)
 
    rc = LOAD_FAIL;
 
-   fdata =
-      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
-   if (fdata == MAP_FAILED)
-      return LOAD_BADFILE;
-
    plane[0] = NULL;
    memset(&ilbm, 0, sizeof(ilbm));
 
@@ -463,7 +457,7 @@ _load(ImlibImage * im, int load_data)
    * Load the chunk(s) we're interested in. If load_data is not true, then we only
    * want the image size and format.
    *----------*/
-   if (!loadchunks(fdata, im->fi->fsize, &ilbm, load_data))
+   if (!loadchunks(im->fi->fdata, im->fi->fsize, &ilbm, load_data))
       goto quit;
 
    rc = LOAD_BADIMAGE;          /* Format accepted */
@@ -569,8 +563,6 @@ _load(ImlibImage * im, int load_data)
 
    freeilbm(&ilbm);
 
-   munmap(fdata, im->fi->fsize);
-
    return rc;
 }
 
diff --git a/src/modules/loaders/loader_png.c b/src/modules/loaders/loader_png.c
index b020433..f69883a 100644
--- a/src/modules/loaders/loader_png.c
+++ b/src/modules/loaders/loader_png.c
@@ -29,6 +29,8 @@ static const char  *const _formats[] = { "png" };
 #define APNG_BLEND_OP_SOURCE	0
 #define APNG_BLEND_OP_OVER	1
 
+#define mm_check(p) ((const char *)(p) <= (const char *)im->fi->fdata + im->fi->fsize)
+
 typedef struct {
    uint32_t            len;
    union {
@@ -290,7 +292,6 @@ static int
 _load(ImlibImage * im, int load_data)
 {
    int                 rc;
-   void               *fdata;
    png_structp         png_ptr = NULL;
    png_infop           info_ptr = NULL;
    ctx_t               ctx = { 0 };
@@ -308,13 +309,8 @@ _load(ImlibImage * im, int load_data)
    if (im->fi->fsize < _PNG_MIN_SIZE)
       return rc;
 
-   fdata =
-      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
-   if (fdata == MAP_FAILED)
-      return LOAD_BADFILE;
-
    /* Signature check */
-   if (png_sig_cmp(fdata, 0, _PNG_SIG_SIZE))
+   if (png_sig_cmp(im->fi->fdata, 0, _PNG_SIG_SIZE))
       goto quit;
 
    png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL,
@@ -347,15 +343,16 @@ _load(ImlibImage * im, int load_data)
 
    frame = 0;                   /* Frame number */
    ctx.pch_fctl = NULL;         /* Ponter to requested frame fcTL chunk */
-   fptr = (unsigned char *)fdata + _PNG_SIG_SIZE;
+   fptr = (unsigned char *)im->fi->fdata;
+   fptr += _PNG_SIG_SIZE;
 
    for (ic = 0;; ic++, fptr += 8 + len + 4)
      {
         chunk = (const png_chunk_t *)fptr;
         len = htonl(chunk->hdr.len);
         D("Scan %3d: %06lx: %6d: %.4s: ", ic,
-          fptr - (unsigned char *)fdata, len, chunk->hdr.name);
-        if (fptr + len - (unsigned char *)fdata > im->fi->fsize)
+          fptr - (unsigned char *)im->fi->fdata, len, chunk->hdr.name);
+        if (!mm_check(fptr + len))
            break;
 
         switch (chunk->hdr.type)
@@ -414,18 +411,18 @@ _load(ImlibImage * im, int load_data)
    save_fdat = 0;
 
    /* At this point we start "progressive" PNG data processing */
-   fptr = fdata;
+   fptr = (unsigned char *)im->fi->fdata;
    png_process_data(png_ptr, info_ptr, fptr, _PNG_SIG_SIZE);
 
-   fptr = (unsigned char *)fdata + _PNG_SIG_SIZE;
+   fptr += _PNG_SIG_SIZE;
 
    for (ic = 0;; ic++, fptr += 8 + len + 4)
      {
         chunk = (const png_chunk_t *)fptr;
         len = htonl(chunk->hdr.len);
         D("Chunk %3d: %06lx: %6d: %.4s: ", ic,
-          fptr - (unsigned char *)fdata, len, chunk->hdr.name);
-        if (fptr + len - (unsigned char *)fdata > im->fi->fsize)
+          fptr - (unsigned char *)im->fi->fdata, len, chunk->hdr.name);
+        if (!mm_check(fptr + len))
            break;
 
         switch (chunk->hdr.type)
@@ -567,7 +564,6 @@ _load(ImlibImage * im, int load_data)
 
  quit:
    png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
-   munmap(fdata, im->fi->fsize);
 
    return rc;
 }
diff --git a/src/modules/loaders/loader_pnm.c b/src/modules/loaders/loader_pnm.c
index 71e35af..b6f06b6 100644
--- a/src/modules/loaders/loader_pnm.c
+++ b/src/modules/loaders/loader_pnm.c
@@ -118,7 +118,6 @@ static int
 _load(ImlibImage * im, int load_data)
 {
    int                 rc;
-   void               *fdata;
    int                 c, p;
    int                 w, h, v, numbers, count;
    uint8_t            *data = ""     /* for the binary versions */
@@ -129,12 +128,7 @@ _load(ImlibImage * im, int load_data)
 
    rc = LOAD_FAIL;
 
-   fdata =
-      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
-   if (fdata == MAP_FAILED)
-      return LOAD_BADFILE;
-
-   mm_init(fdata, im->fi->fsize);
+   mm_init(im->fi->fdata, im->fi->fsize);
 
    /* read the header info */
 
@@ -465,7 +459,6 @@ _load(ImlibImage * im, int load_data)
  quit:
    free(idata);
    free(data);
-   munmap(fdata, im->fi->fsize);
 
    return rc;
 }
diff --git a/src/modules/loaders/loader_ps.c b/src/modules/loaders/loader_ps.c
index 2a0cba0..bb162d0 100644
--- a/src/modules/loaders/loader_ps.c
+++ b/src/modules/loaders/loader_ps.c
@@ -11,7 +11,6 @@ static int
 _load(ImlibImage * im, int load_data)
 {
    int                 rc;
-   void               *fdata;
    SpectreDocument    *spdoc;
    SpectrePage        *sppage;
    SpectreStatus       spst;
@@ -24,18 +23,13 @@ _load(ImlibImage * im, int load_data)
    uint32_t           *dst;
    int                 i, j;
 
-   fdata =
-      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
-   if (fdata == MAP_FAILED)
-      return LOAD_BADFILE;
-
    rc = LOAD_FAIL;
    spdoc = NULL;
    sppage = NULL;
    sprc = NULL;
 
    /* Signature check */
-   if (memcmp(fdata, "%!PS", 4) != 0)
+   if (memcmp(im->fi->fdata, "%!PS", 4) != 0)
       goto quit;
 
    spdoc = spectre_document_new();
@@ -138,7 +132,6 @@ _load(ImlibImage * im, int load_data)
       spectre_page_free(sppage);
    if (spdoc)
       spectre_document_free(spdoc);
-   munmap(fdata, im->fi->fsize);
 
    return rc;
 }
diff --git a/src/modules/loaders/loader_svg.c b/src/modules/loaders/loader_svg.c
index 6ff1db3..97ad9e1 100644
--- a/src/modules/loaders/loader_svg.c
+++ b/src/modules/loaders/loader_svg.c
@@ -72,7 +72,6 @@ static int
 _load(ImlibImage * im, int load_data)
 {
    int                 rc;
-   void               *fdata;
    RsvgHandle         *rsvg;
    GError             *error;
    gboolean            ok;
@@ -80,22 +79,16 @@ _load(ImlibImage * im, int load_data)
    cairo_t            *cr;
 
    rc = LOAD_FAIL;
-
-   fdata =
-      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
-   if (fdata == MAP_FAILED)
-      return LOAD_BADFILE;
-
    error = NULL;
    rsvg = NULL;
    surface = NULL;
    cr = NULL;
 
    /* Signature check */
-   if (_sig_check(fdata, im->fi->fsize))
+   if (_sig_check(im->fi->fdata, im->fi->fsize))
       goto quit;
 
-   rsvg = rsvg_handle_new_from_data(fdata, im->fi->fsize, &error);
+   rsvg = rsvg_handle_new_from_data(im->fi->fdata, im->fi->fsize, &error);
    if (!rsvg)
       goto quit;
 
@@ -242,7 +235,6 @@ _load(ImlibImage * im, int load_data)
       cairo_destroy(cr);
    if (rsvg)
       g_object_unref(rsvg);
-   munmap(fdata, im->fi->fsize);
 
    return rc;
 }
diff --git a/src/modules/loaders/loader_tga.c b/src/modules/loaders/loader_tga.c
index 61e678a..992a8d8 100644
--- a/src/modules/loaders/loader_tga.c
+++ b/src/modules/loaders/loader_tga.c
@@ -71,7 +71,6 @@ static int
 _load(ImlibImage * im, int load_data)
 {
    int                 rc;
-   void               *fdata;
    const unsigned char *fptr;
    const tga_header   *header;
    const tga_footer   *footer;
@@ -90,13 +89,8 @@ _load(ImlibImage * im, int load_data)
        (uintmax_t) im->fi->fsize > SIZE_MAX)
       return rc;
 
-   fdata =
-      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
-   if (fdata == MAP_FAILED)
-      return LOAD_BADFILE;
-
-   fptr = fdata;
-   header = fdata;
+   fptr = im->fi->fdata;
+   header = im->fi->fdata;
 
    if (im->fi->fsize > (int)(sizeof(tga_footer)))
      {
@@ -466,8 +460,6 @@ _load(ImlibImage * im, int load_data)
    rc = LOAD_SUCCESS;
 
  quit:
-   munmap(fdata, im->fi->fsize);
-
    return rc;
 }
 
diff --git a/src/modules/loaders/loader_tiff.c b/src/modules/loaders/loader_tiff.c
index 40e43a5..c9a4ec4 100644
--- a/src/modules/loaders/loader_tiff.c
+++ b/src/modules/loaders/loader_tiff.c
@@ -336,7 +336,6 @@ static int
 _load(ImlibImage * im, int load_data)
 {
    int                 rc;
-   void               *fdata;
    TIFF               *tif = NULL;
    uint16_t            magic_number;
    TIFFRGBAImage_Extra rgba_image;
@@ -352,17 +351,12 @@ _load(ImlibImage * im, int load_data)
    if (im->fi->fsize < (int)TIFF_BYTES_TO_CHECK)
       return rc;
 
-   fdata =
-      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
-   if (fdata == MAP_FAILED)
-      return LOAD_BADFILE;
-
-   magic_number = *(uint16_t *) fdata;
+   magic_number = *(const uint16_t *)im->fi->fdata;
 
    if (magic_number != TIFF_BIGENDIAN && magic_number != TIFF_LITTLEENDIAN)
       return rc;
 
-   mm_init(fdata, im->fi->fsize);
+   mm_init(im->fi->fdata, im->fi->fsize);
 
    tif = TIFFClientOpen(im->fi->name, "r", NULL, _tiff_read, _tiff_write,
                         _tiff_seek, _tiff_close, _tiff_size,
@@ -450,7 +444,6 @@ _load(ImlibImage * im, int load_data)
       TIFFRGBAImageEnd((TIFFRGBAImage *) & rgba_image);
    if (tif)
       TIFFClose(tif);
-   munmap(fdata, im->fi->fsize);
 
    return rc;
 }
diff --git a/src/modules/loaders/loader_webp.c b/src/modules/loaders/loader_webp.c
index e3e20db..053a11a 100644
--- a/src/modules/loaders/loader_webp.c
+++ b/src/modules/loaders/loader_webp.c
@@ -13,7 +13,6 @@ static int
 _load(ImlibImage * im, int load_data)
 {
    int                 rc;
-   void               *fdata;
    WebPData            webp_data;
    WebPDemuxer        *demux;
    WebPIterator        iter;
@@ -24,12 +23,7 @@ _load(ImlibImage * im, int load_data)
    if (im->fi->fsize < 12)
       return rc;
 
-   fdata =
-      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
-   if (fdata == MAP_FAILED)
-      return LOAD_BADFILE;
-
-   webp_data.bytes = fdata;
+   webp_data.bytes = im->fi->fdata;
    webp_data.size = im->fi->fsize;
 
    /* Init (includes signature check) */
@@ -102,7 +96,6 @@ _load(ImlibImage * im, int load_data)
  quit:
    if (demux)
       WebPDemuxDelete(demux);
-   munmap(fdata, im->fi->fsize);
 
    return rc;
 }
diff --git a/src/modules/loaders/loader_xbm.c b/src/modules/loaders/loader_xbm.c
index a004336..77f8fe3 100644
--- a/src/modules/loaders/loader_xbm.c
+++ b/src/modules/loaders/loader_xbm.c
@@ -85,7 +85,6 @@ static int
 _load(ImlibImage * im, int load_data)
 {
    int                 rc;
-   void               *fdata;
    char                buf[4096], tok1[1024], tok2[1024];
    uint32_t           *ptr, pixel;
    int                 i, x, y, bit, nl;
@@ -97,19 +96,14 @@ _load(ImlibImage * im, int load_data)
    if (im->fi->fsize < 64)
       return rc;                /* Not XBM */
 
-   fdata =
-      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
-   if (fdata == MAP_FAILED)
-      return LOAD_BADFILE;
-
    /* Signature check ("#define") allow longish initial comment */
-   s = fdata;
+   s = im->fi->fdata;
    nlen = s[0] == '/' && s[1] == '*' ? 4096 : 256;
    nlen = im->fi->fsize > nlen ? nlen : im->fi->fsize;
    if (!memmem(s, nlen, "#define", 7))
       goto quit;
 
-   mm_init(fdata, im->fi->fsize);
+   mm_init(im->fi->fdata, im->fi->fsize);
 
    ptr = NULL;
    x = y = 0;
@@ -212,8 +206,6 @@ _load(ImlibImage * im, int load_data)
       rc = LOAD_SUCCESS;
 
  quit:
-   munmap(fdata, im->fi->fsize);
-
    return rc;
 }
 
diff --git a/src/modules/loaders/loader_xpm.c b/src/modules/loaders/loader_xpm.c
index c447b8b..7a96c86 100644
--- a/src/modules/loaders/loader_xpm.c
+++ b/src/modules/loaders/loader_xpm.c
@@ -157,7 +157,6 @@ static int
 _load(ImlibImage * im, int load_data)
 {
    int                 rc;
-   void               *fdata;
    uint32_t           *ptr;
    int                 pc, c, i, j, k, w, h, ncolors, cpp;
    int                 comment, transp, quote, context, len, done, backslash;
@@ -174,17 +173,13 @@ _load(ImlibImage * im, int load_data)
    line = NULL;
    cmap = NULL;
 
-   fdata =
-      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
-   if (fdata == MAP_FAILED)
-      return LOAD_BADFILE;
-
-   if (!memmem(fdata, im->fi->fsize <= 256 ? im->fi->fsize : 256, " XPM */", 7))
+   if (!memmem(im->fi->fdata,
+               im->fi->fsize <= 256 ? im->fi->fsize : 256, " XPM */", 7))
       goto quit;
 
    rc = LOAD_BADIMAGE;          /* Format accepted */
 
-   mm_init(fdata, im->fi->fsize);
+   mm_init(im->fi->fdata, im->fi->fsize);
 
    j = 0;
    w = 10;
@@ -473,8 +468,6 @@ _load(ImlibImage * im, int load_data)
 
    xpm_parse_done();
 
-   munmap(fdata, im->fi->fsize);
-
    return rc;
 }
 

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.

Reply via email to