loading: Centralize mmap handling

Loader interface should be stable now.
This commit is contained in:
Kim Woelders 2022-03-28 14:23:18 +02:00
parent e55208f4d6
commit 753065d5a3
24 changed files with 62 additions and 191 deletions

View File

@ -10,7 +10,6 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <sys/mman.h>
/* types.h */ /* types.h */
@ -118,6 +117,7 @@ typedef struct _ImlibImageFileInfo {
struct _ImlibImageFileInfo *next; struct _ImlibImageFileInfo *next;
char *name; char *name;
FILE *fp; FILE *fp;
const void *fdata;
off_t fsize; off_t fsize;
} ImlibImageFileInfo; } ImlibImageFileInfo;

View File

@ -9,6 +9,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <time.h> #include <time.h>
#include <sys/mman.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
@ -78,6 +79,7 @@ static int
__imlib_FileContextOpen(ImlibImageFileInfo * fi, FILE * fp, off_t fsize) __imlib_FileContextOpen(ImlibImageFileInfo * fi, FILE * fp, off_t fsize)
{ {
struct stat st; struct stat st;
void *fdata;
if (fp) if (fp)
{ {
@ -101,6 +103,12 @@ __imlib_FileContextOpen(ImlibImageFileInfo * fi, FILE * fp, off_t fsize)
fi->fsize = 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; return 0;
} }
@ -109,6 +117,11 @@ __imlib_FileContextClose(ImlibImageFileInfo * fi)
{ {
if (!fi->keep_fp) if (!fi->keep_fp)
{ {
if (fi->fdata)
{
munmap((void *)fi->fdata, fi->fsize);
fi->fdata = NULL;
}
if (fi->fp) if (fi->fp)
{ {
fclose(fi->fp); fclose(fi->fp);

View File

@ -30,6 +30,7 @@ typedef struct _ImlibImageFileInfo {
struct _ImlibImageFileInfo *next; struct _ImlibImageFileInfo *next;
char *name; char *name;
FILE *fp; FILE *fp;
const void *fdata;
off_t fsize; off_t fsize;
/* vvv Private vvv */ /* vvv Private vvv */
char keep_fp; char keep_fp;

View File

@ -11,7 +11,6 @@ decompress_load(ImlibImage * im, int load_data, const char *const *pext,
const char *s, *p, *q; const char *s, *p, *q;
char tmp[] = "/tmp/imlib2_loader_dec-XXXXXX"; char tmp[] = "/tmp/imlib2_loader_dec-XXXXXX";
char *real_ext; char *real_ext;
void *fdata;
rc = LOAD_FAIL; rc = LOAD_FAIL;
@ -47,15 +46,10 @@ decompress_load(ImlibImage * im, int load_data, const char *const *pext,
if (!loader) if (!loader)
return rc; 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) if ((dest = mkstemp(tmp)) < 0)
QUIT_WITH_RC(LOAD_OOM); QUIT_WITH_RC(LOAD_OOM);
res = fdec(fdata, im->fi->fsize, dest); res = fdec(im->fi->fdata, im->fi->fsize, dest);
close(dest); close(dest);
@ -65,7 +59,6 @@ decompress_load(ImlibImage * im, int load_data, const char *const *pext,
unlink(tmp); unlink(tmp);
quit: quit:
munmap(fdata, im->fi->fsize);
return rc; return rc;
} }

View File

@ -37,7 +37,6 @@ static int
_load(ImlibImage * im, int load_data) _load(ImlibImage * im, int load_data)
{ {
int rc; int rc;
void *fdata;
int alpha; int alpha;
uint32_t *ptr; uint32_t *ptr;
int y; int y;
@ -50,16 +49,11 @@ _load(ImlibImage * im, int load_data)
rc = LOAD_FAIL; rc = LOAD_FAIL;
fdata = mm_init(im->fi->fdata, im->fi->fsize);
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);
/* header */ /* header */
fptr = fdata; fptr = im->fi->fdata;
size = im->fi->fsize > 31 ? 31 : im->fi->fsize; /* Look for \n in at most 31 byte */ size = im->fi->fsize > 31 ? 31 : im->fi->fsize; /* Look for \n in at most 31 byte */
row = memchr(fptr, '\n', size); row = memchr(fptr, '\n', size);
if (!row) if (!row)
@ -108,8 +102,6 @@ _load(ImlibImage * im, int load_data)
rc = LOAD_SUCCESS; rc = LOAD_SUCCESS;
quit: quit:
munmap(fdata, im->fi->fsize);
return rc; return rc;
} }

View File

@ -158,7 +158,6 @@ static int
_load(ImlibImage * im, int load_data) _load(ImlibImage * im, int load_data)
{ {
int rc; int rc;
void *fdata;
const unsigned char *fptr; const unsigned char *fptr;
bfh_t bfh; bfh_t bfh;
unsigned int bfh_offset; unsigned int bfh_offset;
@ -179,13 +178,8 @@ _load(ImlibImage * im, int load_data)
rc = LOAD_FAIL; rc = LOAD_FAIL;
fdata = fptr = im->fi->fdata;
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0); mm_init(im->fi->fdata, im->fi->fsize);
if (fdata == MAP_FAILED)
return LOAD_BADFILE;
fptr = fdata;
mm_init(fdata, im->fi->fsize);
/* Load header */ /* Load header */
@ -760,8 +754,6 @@ _load(ImlibImage * im, int load_data)
rc = LOAD_SUCCESS; rc = LOAD_SUCCESS;
quit: quit:
munmap(fdata, im->fi->fsize);
return rc; return rc;
} }

View File

@ -6,7 +6,7 @@
static const char *const _formats[] = { "ff" }; 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 { typedef struct {
unsigned char magic[8]; unsigned char magic[8];
@ -17,7 +17,6 @@ static int
_load(ImlibImage * im, int load_data) _load(ImlibImage * im, int load_data)
{ {
int rc; int rc;
void *fdata;
int rowlen, i, j; int rowlen, i, j;
const ff_hdr_t *hdr; const ff_hdr_t *hdr;
const uint16_t *row; const uint16_t *row;
@ -28,13 +27,8 @@ _load(ImlibImage * im, int load_data)
if (im->fi->fsize < (long)sizeof(ff_hdr_t)) if (im->fi->fsize < (long)sizeof(ff_hdr_t))
return rc; 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 */ /* read and check the header */
hdr = fdata; hdr = im->fi->fdata;
if (memcmp("farbfeld", hdr->magic, sizeof(hdr->magic))) if (memcmp("farbfeld", hdr->magic, sizeof(hdr->magic)))
goto quit; goto quit;
@ -83,8 +77,6 @@ _load(ImlibImage * im, int load_data)
rc = LOAD_SUCCESS; rc = LOAD_SUCCESS;
quit: quit:
munmap(fdata, im->fi->fsize);
return rc; return rc;
} }

View File

@ -57,7 +57,6 @@ static int
_load(ImlibImage * im, int load_data) _load(ImlibImage * im, int load_data)
{ {
int rc, err; int rc, err;
void *fdata;
uint32_t *ptr; uint32_t *ptr;
GifFileType *gif; GifFileType *gif;
GifRowType *rows; GifRowType *rows;
@ -68,15 +67,10 @@ _load(ImlibImage * im, int load_data)
uint32_t colormap[256]; uint32_t colormap[256];
int fcount, frame, multiframe; 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; rc = LOAD_FAIL;
rows = NULL; rows = NULL;
mm_init(fdata, im->fi->fsize); mm_init(im->fi->fdata, im->fi->fsize);
#if GIFLIB_MAJOR >= 5 #if GIFLIB_MAJOR >= 5
gif = DGifOpen(NULL, mm_read, &err); gif = DGifOpen(NULL, mm_read, &err);
@ -302,8 +296,6 @@ _load(ImlibImage * im, int load_data)
DGifCloseFile(gif); DGifCloseFile(gif);
#endif #endif
munmap(fdata, im->fi->fsize);
return rc; return rc;
} }

View File

@ -20,7 +20,6 @@ static int
_load(ImlibImage * im, int load_data) _load(ImlibImage * im, int load_data)
{ {
int rc; int rc;
void *fdata;
int img_has_alpha; int img_has_alpha;
int stride = 0; int stride = 0;
int bytes_per_px; int bytes_per_px;
@ -39,13 +38,8 @@ _load(ImlibImage * im, int load_data)
if (im->fi->fsize < HEIF_BYTES_TO_CHECK) if (im->fi->fsize < HEIF_BYTES_TO_CHECK)
return rc; 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 */ /* 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_no:
case heif_filetype_yes_unsupported: case heif_filetype_yes_unsupported:
@ -62,7 +56,7 @@ _load(ImlibImage * im, int load_data)
if (!ctx) if (!ctx)
goto quit; 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); im->fi->fsize, NULL);
if (error.code != heif_error_Ok) if (error.code != heif_error_Ok)
goto quit; goto quit;
@ -156,8 +150,6 @@ _load(ImlibImage * im, int load_data)
heif_context_free(ctx); heif_context_free(ctx);
heif_decoding_options_free(decode_opts); heif_decoding_options_free(decode_opts);
munmap(fdata, im->fi->fsize);
return rc; return rc;
} }

View File

@ -396,18 +396,12 @@ static int
_load(ImlibImage * im, int load_data) _load(ImlibImage * im, int load_data)
{ {
int rc; int rc;
void *fdata;
ico_t ico; ico_t ico;
unsigned int i; unsigned int i;
rc = LOAD_FAIL; rc = LOAD_FAIL;
fdata = mm_init(im->fi->fdata, im->fi->fsize);
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);
ico.ie = NULL; ico.ie = NULL;
if (mm_read(&ico.idir, sizeof(ico.idir))) if (mm_read(&ico.idir, sizeof(ico.idir)))
@ -444,7 +438,6 @@ _load(ImlibImage * im, int load_data)
quit: quit:
ico_delete(&ico); ico_delete(&ico);
munmap(fdata, im->fi->fsize);
return rc; return rc;
} }

View File

@ -500,6 +500,9 @@ _load(ImlibImage * im, int load_data)
rc = LOAD_FAIL; rc = LOAD_FAIL;
opt.ctx = NULL; opt.ctx = NULL;
if (!im->fi->fp)
return rc;
if (!get_options(&opt, im)) if (!get_options(&opt, im))
goto quit; goto quit;

View File

@ -96,7 +96,6 @@ static int
_load(ImlibImage * im, int load_data) _load(ImlibImage * im, int load_data)
{ {
int rc; int rc;
void *fdata;
int ok; int ok;
opj_dparameters_t jparam; opj_dparameters_t jparam;
opj_codec_t *jcodec; opj_codec_t *jcodec;
@ -108,11 +107,6 @@ _load(ImlibImage * im, int load_data)
OPJ_INT32 *pa, *pr, *pg, *pb; OPJ_INT32 *pa, *pr, *pg, *pb;
unsigned char a, r, g, b; 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; rc = LOAD_FAIL;
jcodec = NULL; jcodec = NULL;
jstream = NULL; jstream = NULL;
@ -122,10 +116,10 @@ _load(ImlibImage * im, int load_data)
if (im->fi->fsize < 12) if (im->fi->fsize < 12)
goto quit; goto quit;
if (memcmp(fdata, JP2_MAGIC, 4) == 0 || if (memcmp(im->fi->fdata, JP2_MAGIC, 4) == 0 ||
memcmp(fdata, JP2_RFC3745_MAGIC, 12) == 0) memcmp(im->fi->fdata, JP2_RFC3745_MAGIC, 12) == 0)
jfmt = OPJ_CODEC_JP2; 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; jfmt = OPJ_CODEC_J2K;
else else
goto quit; goto quit;
@ -164,7 +158,7 @@ _load(ImlibImage * im, int load_data)
if (!jstream) if (!jstream)
goto quit; 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(jstream, &mdata, NULL);
opj_stream_set_user_data_length(jstream, im->fi->fsize); opj_stream_set_user_data_length(jstream, im->fi->fsize);
opj_stream_set_read_function(jstream, mm_read); opj_stream_set_read_function(jstream, mm_read);
@ -275,7 +269,6 @@ _load(ImlibImage * im, int load_data)
opj_stream_destroy(jstream); opj_stream_destroy(jstream);
if (jcodec) if (jcodec)
opj_destroy_codec(jcodec); opj_destroy_codec(jcodec);
munmap(fdata, im->fi->fsize);
return rc; return rc;
} }

View File

@ -68,7 +68,6 @@ static int
_load(ImlibImage * im, int load_data) _load(ImlibImage * im, int load_data)
{ {
int w, h, rc; int w, h, rc;
void *fdata;
struct jpeg_decompress_struct jds; struct jpeg_decompress_struct jds;
ImLib_JPEG_data jdata; ImLib_JPEG_data jdata;
uint8_t *ptr, *line[16]; uint8_t *ptr, *line[16];
@ -78,18 +77,13 @@ _load(ImlibImage * im, int load_data)
rc = LOAD_FAIL; 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 */ /* set up error handling */
jds.err = _jdata_init(&jdata); jds.err = _jdata_init(&jdata);
if (sigsetjmp(jdata.setjmp_buffer, 1)) if (sigsetjmp(jdata.setjmp_buffer, 1))
QUIT_WITH_RC(LOAD_FAIL); QUIT_WITH_RC(LOAD_FAIL);
jpeg_create_decompress(&jds); 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_save_markers(&jds, JPEG_APP0 + 1, 256);
jpeg_read_header(&jds, TRUE); jpeg_read_header(&jds, TRUE);
@ -252,7 +246,6 @@ _load(ImlibImage * im, int load_data)
quit: quit:
jpeg_destroy_decompress(&jds); jpeg_destroy_decompress(&jds);
free(jdata.data); free(jdata.data);
munmap(fdata, im->fi->fsize);
return rc; return rc;
} }

View File

@ -43,7 +43,6 @@ _load(ImlibImage * im, int load_data)
}; };
int rc; int rc;
void *fdata;
JxlDecoderStatus jst; JxlDecoderStatus jst;
JxlDecoder *dec; JxlDecoder *dec;
JxlBasicInfo info; JxlBasicInfo info;
@ -55,15 +54,10 @@ _load(ImlibImage * im, int load_data)
JxlParallelRunner *runner = NULL; JxlParallelRunner *runner = NULL;
#endif #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; rc = LOAD_FAIL;
dec = NULL; dec = NULL;
switch (JxlSignatureCheck(fdata, 128)) switch (JxlSignatureCheck(im->fi->fdata, 128))
{ {
default: default:
// case JXL_SIG_NOT_ENOUGH_BYTES: // case JXL_SIG_NOT_ENOUGH_BYTES:
@ -101,7 +95,7 @@ _load(ImlibImage * im, int load_data)
if (jst != JXL_DEC_SUCCESS) if (jst != JXL_DEC_SUCCESS)
goto quit; goto quit;
jst = JxlDecoderSetInput(dec, fdata, im->fi->fsize); jst = JxlDecoderSetInput(dec, im->fi->fdata, im->fi->fsize);
if (jst != JXL_DEC_SUCCESS) if (jst != JXL_DEC_SUCCESS)
goto quit; goto quit;
@ -214,7 +208,6 @@ _load(ImlibImage * im, int load_data)
#endif #endif
if (dec) if (dec)
JxlDecoderDestroy(dec); JxlDecoderDestroy(dec);
munmap(fdata, im->fi->fsize);
return rc; return rc;
} }

View File

@ -443,7 +443,6 @@ static int
_load(ImlibImage * im, int load_data) _load(ImlibImage * im, int load_data)
{ {
int rc; int rc;
void *fdata;
char *env; char *env;
int i, n, y, z; int i, n, y, z;
unsigned char *plane[40]; unsigned char *plane[40];
@ -451,11 +450,6 @@ _load(ImlibImage * im, int load_data)
rc = LOAD_FAIL; 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; plane[0] = NULL;
memset(&ilbm, 0, sizeof(ilbm)); 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 * Load the chunk(s) we're interested in. If load_data is not true, then we only
* want the image size and format. * 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; goto quit;
rc = LOAD_BADIMAGE; /* Format accepted */ rc = LOAD_BADIMAGE; /* Format accepted */
@ -569,8 +563,6 @@ _load(ImlibImage * im, int load_data)
freeilbm(&ilbm); freeilbm(&ilbm);
munmap(fdata, im->fi->fsize);
return rc; return rc;
} }

View File

@ -29,6 +29,8 @@ static const char *const _formats[] = { "png" };
#define APNG_BLEND_OP_SOURCE 0 #define APNG_BLEND_OP_SOURCE 0
#define APNG_BLEND_OP_OVER 1 #define APNG_BLEND_OP_OVER 1
#define mm_check(p) ((const char *)(p) <= (const char *)im->fi->fdata + im->fi->fsize)
typedef struct { typedef struct {
uint32_t len; uint32_t len;
union { union {
@ -290,7 +292,6 @@ static int
_load(ImlibImage * im, int load_data) _load(ImlibImage * im, int load_data)
{ {
int rc; int rc;
void *fdata;
png_structp png_ptr = NULL; png_structp png_ptr = NULL;
png_infop info_ptr = NULL; png_infop info_ptr = NULL;
ctx_t ctx = { 0 }; ctx_t ctx = { 0 };
@ -308,13 +309,8 @@ _load(ImlibImage * im, int load_data)
if (im->fi->fsize < _PNG_MIN_SIZE) if (im->fi->fsize < _PNG_MIN_SIZE)
return rc; 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 */ /* Signature check */
if (png_sig_cmp(fdata, 0, _PNG_SIG_SIZE)) if (png_sig_cmp(im->fi->fdata, 0, _PNG_SIG_SIZE))
goto quit; goto quit;
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, 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 */ frame = 0; /* Frame number */
ctx.pch_fctl = NULL; /* Ponter to requested frame fcTL chunk */ 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) for (ic = 0;; ic++, fptr += 8 + len + 4)
{ {
chunk = (const png_chunk_t *)fptr; chunk = (const png_chunk_t *)fptr;
len = htonl(chunk->hdr.len); len = htonl(chunk->hdr.len);
D("Scan %3d: %06lx: %6d: %.4s: ", ic, D("Scan %3d: %06lx: %6d: %.4s: ", ic,
fptr - (unsigned char *)fdata, len, chunk->hdr.name); fptr - (unsigned char *)im->fi->fdata, len, chunk->hdr.name);
if (fptr + len - (unsigned char *)fdata > im->fi->fsize) if (!mm_check(fptr + len))
break; break;
switch (chunk->hdr.type) switch (chunk->hdr.type)
@ -414,18 +411,18 @@ _load(ImlibImage * im, int load_data)
save_fdat = 0; save_fdat = 0;
/* At this point we start "progressive" PNG data processing */ /* 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); 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) for (ic = 0;; ic++, fptr += 8 + len + 4)
{ {
chunk = (const png_chunk_t *)fptr; chunk = (const png_chunk_t *)fptr;
len = htonl(chunk->hdr.len); len = htonl(chunk->hdr.len);
D("Chunk %3d: %06lx: %6d: %.4s: ", ic, D("Chunk %3d: %06lx: %6d: %.4s: ", ic,
fptr - (unsigned char *)fdata, len, chunk->hdr.name); fptr - (unsigned char *)im->fi->fdata, len, chunk->hdr.name);
if (fptr + len - (unsigned char *)fdata > im->fi->fsize) if (!mm_check(fptr + len))
break; break;
switch (chunk->hdr.type) switch (chunk->hdr.type)
@ -567,7 +564,6 @@ _load(ImlibImage * im, int load_data)
quit: quit:
png_destroy_read_struct(&png_ptr, &info_ptr, NULL); png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
munmap(fdata, im->fi->fsize);
return rc; return rc;
} }

View File

@ -118,7 +118,6 @@ static int
_load(ImlibImage * im, int load_data) _load(ImlibImage * im, int load_data)
{ {
int rc; int rc;
void *fdata;
int c, p; int c, p;
int w, h, v, numbers, count; int w, h, v, numbers, count;
uint8_t *data = NULL; /* for the binary versions */ uint8_t *data = NULL; /* for the binary versions */
@ -129,12 +128,7 @@ _load(ImlibImage * im, int load_data)
rc = LOAD_FAIL; rc = LOAD_FAIL;
fdata = mm_init(im->fi->fdata, im->fi->fsize);
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);
/* read the header info */ /* read the header info */
@ -465,7 +459,6 @@ _load(ImlibImage * im, int load_data)
quit: quit:
free(idata); free(idata);
free(data); free(data);
munmap(fdata, im->fi->fsize);
return rc; return rc;
} }

View File

@ -11,7 +11,6 @@ static int
_load(ImlibImage * im, int load_data) _load(ImlibImage * im, int load_data)
{ {
int rc; int rc;
void *fdata;
SpectreDocument *spdoc; SpectreDocument *spdoc;
SpectrePage *sppage; SpectrePage *sppage;
SpectreStatus spst; SpectreStatus spst;
@ -24,18 +23,13 @@ _load(ImlibImage * im, int load_data)
uint32_t *dst; uint32_t *dst;
int i, j; 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; rc = LOAD_FAIL;
spdoc = NULL; spdoc = NULL;
sppage = NULL; sppage = NULL;
sprc = NULL; sprc = NULL;
/* Signature check */ /* Signature check */
if (memcmp(fdata, "%!PS", 4) != 0) if (memcmp(im->fi->fdata, "%!PS", 4) != 0)
goto quit; goto quit;
spdoc = spectre_document_new(); spdoc = spectre_document_new();
@ -138,7 +132,6 @@ _load(ImlibImage * im, int load_data)
spectre_page_free(sppage); spectre_page_free(sppage);
if (spdoc) if (spdoc)
spectre_document_free(spdoc); spectre_document_free(spdoc);
munmap(fdata, im->fi->fsize);
return rc; return rc;
} }

View File

@ -72,7 +72,6 @@ static int
_load(ImlibImage * im, int load_data) _load(ImlibImage * im, int load_data)
{ {
int rc; int rc;
void *fdata;
RsvgHandle *rsvg; RsvgHandle *rsvg;
GError *error; GError *error;
gboolean ok; gboolean ok;
@ -80,22 +79,16 @@ _load(ImlibImage * im, int load_data)
cairo_t *cr; cairo_t *cr;
rc = LOAD_FAIL; 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; error = NULL;
rsvg = NULL; rsvg = NULL;
surface = NULL; surface = NULL;
cr = NULL; cr = NULL;
/* Signature check */ /* Signature check */
if (_sig_check(fdata, im->fi->fsize)) if (_sig_check(im->fi->fdata, im->fi->fsize))
goto quit; 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) if (!rsvg)
goto quit; goto quit;
@ -242,7 +235,6 @@ _load(ImlibImage * im, int load_data)
cairo_destroy(cr); cairo_destroy(cr);
if (rsvg) if (rsvg)
g_object_unref(rsvg); g_object_unref(rsvg);
munmap(fdata, im->fi->fsize);
return rc; return rc;
} }

View File

@ -71,7 +71,6 @@ static int
_load(ImlibImage * im, int load_data) _load(ImlibImage * im, int load_data)
{ {
int rc; int rc;
void *fdata;
const unsigned char *fptr; const unsigned char *fptr;
const tga_header *header; const tga_header *header;
const tga_footer *footer; const tga_footer *footer;
@ -90,13 +89,8 @@ _load(ImlibImage * im, int load_data)
(uintmax_t) im->fi->fsize > SIZE_MAX) (uintmax_t) im->fi->fsize > SIZE_MAX)
return rc; return rc;
fdata = fptr = im->fi->fdata;
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0); header = im->fi->fdata;
if (fdata == MAP_FAILED)
return LOAD_BADFILE;
fptr = fdata;
header = fdata;
if (im->fi->fsize > (int)(sizeof(tga_footer))) if (im->fi->fsize > (int)(sizeof(tga_footer)))
{ {
@ -466,8 +460,6 @@ _load(ImlibImage * im, int load_data)
rc = LOAD_SUCCESS; rc = LOAD_SUCCESS;
quit: quit:
munmap(fdata, im->fi->fsize);
return rc; return rc;
} }

View File

@ -336,7 +336,6 @@ static int
_load(ImlibImage * im, int load_data) _load(ImlibImage * im, int load_data)
{ {
int rc; int rc;
void *fdata;
TIFF *tif = NULL; TIFF *tif = NULL;
uint16_t magic_number; uint16_t magic_number;
TIFFRGBAImage_Extra rgba_image; TIFFRGBAImage_Extra rgba_image;
@ -352,17 +351,12 @@ _load(ImlibImage * im, int load_data)
if (im->fi->fsize < (int)TIFF_BYTES_TO_CHECK) if (im->fi->fsize < (int)TIFF_BYTES_TO_CHECK)
return rc; return rc;
fdata = magic_number = *(const uint16_t *)im->fi->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;
if (magic_number != TIFF_BIGENDIAN && magic_number != TIFF_LITTLEENDIAN) if (magic_number != TIFF_BIGENDIAN && magic_number != TIFF_LITTLEENDIAN)
return rc; 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, tif = TIFFClientOpen(im->fi->name, "r", NULL, _tiff_read, _tiff_write,
_tiff_seek, _tiff_close, _tiff_size, _tiff_seek, _tiff_close, _tiff_size,
@ -450,7 +444,6 @@ _load(ImlibImage * im, int load_data)
TIFFRGBAImageEnd((TIFFRGBAImage *) & rgba_image); TIFFRGBAImageEnd((TIFFRGBAImage *) & rgba_image);
if (tif) if (tif)
TIFFClose(tif); TIFFClose(tif);
munmap(fdata, im->fi->fsize);
return rc; return rc;
} }

View File

@ -13,7 +13,6 @@ static int
_load(ImlibImage * im, int load_data) _load(ImlibImage * im, int load_data)
{ {
int rc; int rc;
void *fdata;
WebPData webp_data; WebPData webp_data;
WebPDemuxer *demux; WebPDemuxer *demux;
WebPIterator iter; WebPIterator iter;
@ -24,12 +23,7 @@ _load(ImlibImage * im, int load_data)
if (im->fi->fsize < 12) if (im->fi->fsize < 12)
return rc; return rc;
fdata = webp_data.bytes = im->fi->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.size = im->fi->fsize; webp_data.size = im->fi->fsize;
/* Init (includes signature check) */ /* Init (includes signature check) */
@ -102,7 +96,6 @@ _load(ImlibImage * im, int load_data)
quit: quit:
if (demux) if (demux)
WebPDemuxDelete(demux); WebPDemuxDelete(demux);
munmap(fdata, im->fi->fsize);
return rc; return rc;
} }

View File

@ -85,7 +85,6 @@ static int
_load(ImlibImage * im, int load_data) _load(ImlibImage * im, int load_data)
{ {
int rc; int rc;
void *fdata;
char buf[4096], tok1[1024], tok2[1024]; char buf[4096], tok1[1024], tok2[1024];
uint32_t *ptr, pixel; uint32_t *ptr, pixel;
int i, x, y, bit, nl; int i, x, y, bit, nl;
@ -97,19 +96,14 @@ _load(ImlibImage * im, int load_data)
if (im->fi->fsize < 64) if (im->fi->fsize < 64)
return rc; /* Not XBM */ 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 */ /* Signature check ("#define") allow longish initial comment */
s = fdata; s = im->fi->fdata;
nlen = s[0] == '/' && s[1] == '*' ? 4096 : 256; nlen = s[0] == '/' && s[1] == '*' ? 4096 : 256;
nlen = im->fi->fsize > nlen ? nlen : im->fi->fsize; nlen = im->fi->fsize > nlen ? nlen : im->fi->fsize;
if (!memmem(s, nlen, "#define", 7)) if (!memmem(s, nlen, "#define", 7))
goto quit; goto quit;
mm_init(fdata, im->fi->fsize); mm_init(im->fi->fdata, im->fi->fsize);
ptr = NULL; ptr = NULL;
x = y = 0; x = y = 0;
@ -212,8 +206,6 @@ _load(ImlibImage * im, int load_data)
rc = LOAD_SUCCESS; rc = LOAD_SUCCESS;
quit: quit:
munmap(fdata, im->fi->fsize);
return rc; return rc;
} }

View File

@ -157,7 +157,6 @@ static int
_load(ImlibImage * im, int load_data) _load(ImlibImage * im, int load_data)
{ {
int rc; int rc;
void *fdata;
uint32_t *ptr; uint32_t *ptr;
int pc, c, i, j, k, w, h, ncolors, cpp; int pc, c, i, j, k, w, h, ncolors, cpp;
int comment, transp, quote, context, len, done, backslash; int comment, transp, quote, context, len, done, backslash;
@ -174,17 +173,13 @@ _load(ImlibImage * im, int load_data)
line = NULL; line = NULL;
cmap = NULL; cmap = NULL;
fdata = if (!memmem(im->fi->fdata,
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0); im->fi->fsize <= 256 ? im->fi->fsize : 256, " XPM */", 7))
if (fdata == MAP_FAILED)
return LOAD_BADFILE;
if (!memmem(fdata, im->fi->fsize <= 256 ? im->fi->fsize : 256, " XPM */", 7))
goto quit; goto quit;
rc = LOAD_BADIMAGE; /* Format accepted */ rc = LOAD_BADIMAGE; /* Format accepted */
mm_init(fdata, im->fi->fsize); mm_init(im->fi->fdata, im->fi->fsize);
j = 0; j = 0;
w = 10; w = 10;
@ -473,8 +468,6 @@ _load(ImlibImage * im, int load_data)
xpm_parse_done(); xpm_parse_done();
munmap(fdata, im->fi->fsize);
return rc; return rc;
} }