image: Don't munmap external memory
When loading image from memory (imlib_load_image[_frame]_mem()) the memory was unintentionally munmapped after loading. This would cause trouble if loading multiple times from the same mmap'ed memory, but not from malloced memory as the munmap would then just fail silently. #1
This commit is contained in:
parent
6151f9be2e
commit
51906190a1
|
@ -29,6 +29,7 @@ struct _ImlibImageFileInfo {
|
|||
off_t fsize;
|
||||
/* vvv Private vvv */
|
||||
bool keep_fp;
|
||||
bool keep_mem;
|
||||
/* ^^^ Private ^^^ */
|
||||
};
|
||||
|
||||
|
@ -97,7 +98,11 @@ __imlib_FileContextOpen(ImlibImageFileInfo * fi, FILE * fp,
|
|||
fi->keep_fp = true;
|
||||
fi->fp = fp;
|
||||
}
|
||||
else if (!fdata)
|
||||
else if (fdata)
|
||||
{
|
||||
fi->keep_mem = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
fi->fp = fopen(fi->name, "rb");
|
||||
if (!fi->fp)
|
||||
|
@ -129,18 +134,16 @@ __imlib_FileContextOpen(ImlibImageFileInfo * fi, FILE * fp,
|
|||
static void
|
||||
__imlib_FileContextClose(ImlibImageFileInfo * fi)
|
||||
{
|
||||
if (!fi->keep_fp)
|
||||
if (fi->fdata && !fi->keep_mem)
|
||||
{
|
||||
if (fi->fdata)
|
||||
{
|
||||
munmap((void *)fi->fdata, fi->fsize);
|
||||
fi->fdata = NULL;
|
||||
}
|
||||
if (fi->fp)
|
||||
{
|
||||
fclose(fi->fp);
|
||||
fi->fp = NULL;
|
||||
}
|
||||
munmap((void *)fi->fdata, fi->fsize);
|
||||
fi->fdata = NULL;
|
||||
}
|
||||
|
||||
if (fi->fp && !fi->keep_fp)
|
||||
{
|
||||
fclose(fi->fp);
|
||||
fi->fp = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -200,12 +200,15 @@ test_load(void)
|
|||
fdata = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
|
||||
ASSERT_TRUE(fdata != NULL);
|
||||
ASSERT_TRUE(fdata != MAP_FAILED);
|
||||
D("Load mem %d '%s'\n", fd, fileo);
|
||||
snprintf(fileo, sizeof(fileo), ".%s", pfxs[i]);
|
||||
im = imlib_load_image_mem(pfxs[i], &err, fdata, st.st_size);
|
||||
EXPECT_TRUE(im) << "Load mem: " << fileo;
|
||||
if (im)
|
||||
image_free(im);
|
||||
for (int n = 0; n < 3; n++)
|
||||
{
|
||||
D("Load mem[%d] %d '%s'\n", n, fd, fileo);
|
||||
snprintf(fileo, sizeof(fileo), ".%s", pfxs[i]);
|
||||
im = imlib_load_image_mem(pfxs[i], &err, fdata, st.st_size);
|
||||
EXPECT_TRUE(im) << "Load mem: " << fileo;
|
||||
if (im)
|
||||
image_free(im);
|
||||
}
|
||||
munmap(fdata, st.st_size);
|
||||
err = close(fd);
|
||||
EXPECT_EQ(err, 0);
|
||||
|
|
Loading…
Reference in New Issue