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 3b241cff10f2674940341bc804edec474d57a5fa
Author: Kim Woelders <[email protected]>
AuthorDate: Mon May 9 18:56:12 2022 +0200

    x11_color: Simplify and fix error paths
    
    Freeing color on failure in __imlib_AllocColors1() was missing.
    
    Success is 0 but using it as such here is confusing since return value 0
    means failure.
---
 src/lib/x11_color.c | 130 +++++++++++++++++-----------------------------------
 1 file changed, 43 insertions(+), 87 deletions(-)

diff --git a/src/lib/x11_color.c b/src/lib/x11_color.c
index 6531317..3ca1168 100644
--- a/src/lib/x11_color.c
+++ b/src/lib/x11_color.c
@@ -70,6 +70,22 @@ __imlib_BestVisual(Display * d, int screen, int *depth_return)
    return v;
 }
 
+static void
+_free_colors(Display * d, Colormap cmap, uint8_t * lut, int num)
+{
+   unsigned long       pixels[256];
+   int                 i;
+
+   if (num > 0)
+     {
+        for (i = 0; i < num; i++)
+           pixels[i] = (unsigned long)lut[i];
+        XFreeColors(d, cmap, pixels, num, 0);
+     }
+
+   free(lut);
+}
+
 static uint8_t     *
 __imlib_AllocColors332(Display * d, Colormap cmap, Visual * v)
 {
@@ -103,21 +119,12 @@ __imlib_AllocColors332(Display * d, Colormap cmap, Visual * v)
                   xcl.blue = (unsigned short)((val << 8) | (val));
                   xcl_in = xcl;
                   ret = XAllocColor(d, cmap, &xcl);
-                  if ((ret == Success) ||
+                  if ((ret == 0) ||
                       ((xcl_in.red & sig_mask) != (xcl.red & sig_mask)) ||
                       ((xcl_in.green & sig_mask) != (xcl.green & sig_mask)) ||
                       ((xcl_in.blue & sig_mask) != (xcl.blue & sig_mask)))
                     {
-                       unsigned long       pixels[256];
-                       int                 j;
-
-                       if (i > 0)
-                         {
-                            for (j = 0; j < i; j++)
-                               pixels[j] = (unsigned long)color_lut[j];
-                            XFreeColors(d, cmap, pixels, i, 0);
-                         }
-                       free(color_lut);
+                       _free_colors(d, cmap, color_lut, i);
                        return NULL;
                     }
                   color_lut[i] = xcl.pixel;
@@ -161,21 +168,12 @@ __imlib_AllocColors666(Display * d, Colormap cmap, Visual * v)
                   xcl.blue = (unsigned short)(val);
                   xcl_in = xcl;
                   ret = XAllocColor(d, cmap, &xcl);
-                  if ((ret == Success) ||
+                  if ((ret == 0) ||
                       ((xcl_in.red & sig_mask) != (xcl.red & sig_mask)) ||
                       ((xcl_in.green & sig_mask) != (xcl.green & sig_mask)) ||
                       ((xcl_in.blue & sig_mask) != (xcl.blue & sig_mask)))
                     {
-                       unsigned long       pixels[256];
-                       int                 j;
-
-                       if (i > 0)
-                         {
-                            for (j = 0; j < i; j++)
-                               pixels[j] = (unsigned long)color_lut[j];
-                            XFreeColors(d, cmap, pixels, i, 0);
-                         }
-                       free(color_lut);
+                       _free_colors(d, cmap, color_lut, i);
                        return NULL;
                     }
                   color_lut[i] = xcl.pixel;
@@ -219,21 +217,12 @@ __imlib_AllocColors232(Display * d, Colormap cmap, Visual * v)
                   xcl.blue = (unsigned short)((val << 8) | (val));
                   xcl_in = xcl;
                   ret = XAllocColor(d, cmap, &xcl);
-                  if ((ret == Success) ||
+                  if ((ret == 0) ||
                       ((xcl_in.red & sig_mask) != (xcl.red & sig_mask)) ||
                       ((xcl_in.green & sig_mask) != (xcl.green & sig_mask)) ||
                       ((xcl_in.blue & sig_mask) != (xcl.blue & sig_mask)))
                     {
-                       unsigned long       pixels[256];
-                       int                 j;
-
-                       if (i > 0)
-                         {
-                            for (j = 0; j < i; j++)
-                               pixels[j] = (unsigned long)color_lut[j];
-                            XFreeColors(d, cmap, pixels, i, 0);
-                         }
-                       free(color_lut);
+                       _free_colors(d, cmap, color_lut, i);
                        return NULL;
                     }
                   color_lut[i] = xcl.pixel;
@@ -277,21 +266,12 @@ __imlib_AllocColors222(Display * d, Colormap cmap, Visual * v)
                   xcl.blue = (unsigned short)((val << 8) | (val));
                   xcl_in = xcl;
                   ret = XAllocColor(d, cmap, &xcl);
-                  if ((ret == Success) ||
+                  if ((ret == 0) ||
                       ((xcl_in.red & sig_mask) != (xcl.red & sig_mask)) ||
                       ((xcl_in.green & sig_mask) != (xcl.green & sig_mask)) ||
                       ((xcl_in.blue & sig_mask) != (xcl.blue & sig_mask)))
                     {
-                       unsigned long       pixels[256];
-                       int                 j;
-
-                       if (i > 0)
-                         {
-                            for (j = 0; j < i; j++)
-                               pixels[j] = (unsigned long)color_lut[j];
-                            XFreeColors(d, cmap, pixels, i, 0);
-                         }
-                       free(color_lut);
+                       _free_colors(d, cmap, color_lut, i);
                        return NULL;
                     }
                   color_lut[i] = xcl.pixel;
@@ -336,21 +316,12 @@ __imlib_AllocColors221(Display * d, Colormap cmap, Visual * v)
                   xcl.blue = (unsigned short)((val << 8) | (val));
                   xcl_in = xcl;
                   ret = XAllocColor(d, cmap, &xcl);
-                  if ((ret == Success) ||
+                  if ((ret == 0) ||
                       ((xcl_in.red & sig_mask) != (xcl.red & sig_mask)) ||
                       ((xcl_in.green & sig_mask) != (xcl.green & sig_mask)) ||
                       ((xcl_in.blue & sig_mask) != (xcl.blue & sig_mask)))
                     {
-                       unsigned long       pixels[256];
-                       int                 j;
-
-                       if (i > 0)
-                         {
-                            for (j = 0; j < i; j++)
-                               pixels[j] = (unsigned long)color_lut[j];
-                            XFreeColors(d, cmap, pixels, i, 0);
-                         }
-                       free(color_lut);
+                       _free_colors(d, cmap, color_lut, i);
                        return NULL;
                     }
                   color_lut[i] = xcl.pixel;
@@ -396,21 +367,12 @@ __imlib_AllocColors121(Display * d, Colormap cmap, Visual * v)
                   xcl.blue = (unsigned short)((val << 8) | (val));
                   xcl_in = xcl;
                   ret = XAllocColor(d, cmap, &xcl);
-                  if ((ret == Success) ||
+                  if ((ret == 0) ||
                       ((xcl_in.red & sig_mask) != (xcl.red & sig_mask)) ||
                       ((xcl_in.green & sig_mask) != (xcl.green & sig_mask)) ||
                       ((xcl_in.blue & sig_mask) != (xcl.blue & sig_mask)))
                     {
-                       unsigned long       pixels[256];
-                       int                 j;
-
-                       if (i > 0)
-                         {
-                            for (j = 0; j < i; j++)
-                               pixels[j] = (unsigned long)color_lut[j];
-                            XFreeColors(d, cmap, pixels, i, 0);
-                         }
-                       free(color_lut);
+                       _free_colors(d, cmap, color_lut, i);
                        return NULL;
                     }
                   color_lut[i] = xcl.pixel;
@@ -457,21 +419,12 @@ __imlib_AllocColors111(Display * d, Colormap cmap, Visual * v)
                   xcl.blue = (unsigned short)((val << 8) | (val));
                   xcl_in = xcl;
                   ret = XAllocColor(d, cmap, &xcl);
-                  if ((ret == Success) ||
+                  if ((ret == 0) ||
                       ((xcl_in.red & sig_mask) != (xcl.red & sig_mask)) ||
                       ((xcl_in.green & sig_mask) != (xcl.green & sig_mask)) ||
                       ((xcl_in.blue & sig_mask) != (xcl.blue & sig_mask)))
                     {
-                       unsigned long       pixels[256];
-                       int                 j;
-
-                       if (i > 0)
-                         {
-                            for (j = 0; j < i; j++)
-                               pixels[j] = (unsigned long)color_lut[j];
-                            XFreeColors(d, cmap, pixels, i, 0);
-                         }
-                       free(color_lut);
+                       _free_colors(d, cmap, color_lut, i);
                        return NULL;
                     }
                   color_lut[i] = xcl.pixel;
@@ -487,29 +440,32 @@ __imlib_AllocColors1(Display * d, Colormap cmap, Visual * v)
 {
    XColor              xcl;
    uint8_t            *color_lut;
+   int                 i;
 
    color_lut = malloc(2 * sizeof(uint8_t));
    if (!color_lut)
       return NULL;
+
+   i = 0;
    xcl.red = (unsigned short)(0x0000);
    xcl.green = (unsigned short)(0x0000);
    xcl.blue = (unsigned short)(0x0000);
    if (!XAllocColor(d, cmap, &xcl))
-     {
-        free(color_lut);
-        return NULL;
-     }
-   color_lut[0] = xcl.pixel;
+      goto bail;
+   color_lut[i++] = xcl.pixel;
+
    xcl.red = (unsigned short)(0xffff);
    xcl.green = (unsigned short)(0xffff);
    xcl.blue = (unsigned short)(0xffff);
    if (!XAllocColor(d, cmap, &xcl))
-     {
-        free(color_lut);
-        return NULL;
-     }
-   color_lut[1] = xcl.pixel;
+      goto bail;
+   color_lut[i] = xcl.pixel;
+
    return color_lut;
+
+ bail:
+   _free_colors(d, cmap, color_lut, i);
+   return NULL;
 }
 
 uint8_t            *

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

Reply via email to