loading: Centralize mmap handling
Loader interface should be stable now.
This commit is contained in:
parent
e55208f4d6
commit
753065d5a3
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue