This is an automated email from the git hooks/post-receive script.

git pushed a commit to branch master
in repository legacy-imlib2.

View the commit online.

commit 51906190a1acba9a649e7d5dc0038a776ab61397
Author: Kim Woelders <[email protected]>
AuthorDate: Thu Sep 29 12:00:50 2022 +0200

    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.
    
    https://git.enlightenment.org/old/legacy-imlib2/issues/1
---
 src/lib/image.c    | 27 +++++++++++++++------------
 test/test_load.cpp | 15 +++++++++------
 2 files changed, 24 insertions(+), 18 deletions(-)

diff --git a/src/lib/image.c b/src/lib/image.c
index 0ed53a7..4e54b9a 100644
--- a/src/lib/image.c
+++ b/src/lib/image.c
@@ -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;
      }
 }
 
diff --git a/test/test_load.cpp b/test/test_load.cpp
index f8fde9f..7e0740b 100644
--- a/test/test_load.cpp
+++ b/test/test_load.cpp
@@ -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);

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.

Reply via email to