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:
Kim Woelders 2022-09-29 12:00:50 +02:00
parent 6151f9be2e
commit 51906190a1
2 changed files with 24 additions and 18 deletions

View File

@ -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;
}
}

View File

@ -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);