From 753065d5a3eeddc6851f35193bf1613709a53412 Mon Sep 17 00:00:00 2001 From: Kim Woelders Date: Mon, 28 Mar 2022 14:23:18 +0200 Subject: [PATCH] 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 #include #include -#include /* 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 #include #include +#include #include #include @@ -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 = NULL; /* 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; }