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

git pushed a commit to branch master
in repository e16-epplets.

View the commit online.

commit acf2e352563dcb89fef938e702b5cdf619d1f6b6
Author: Kim Woelders <k...@woelders.dk>
AuthorDate: Tue Aug 13 08:42:24 2024 +0200

    E-Slides: Fix potential segv
    
    If there was only one background and it was attempted to chose the
    previous a segv would occur.
---
 epplets/E-Slides.c | 70 +++++++++++++++++++++++++++++-------------------------
 1 file changed, 37 insertions(+), 33 deletions(-)

diff --git a/epplets/E-Slides.c b/epplets/E-Slides.c
index 3e7f963..1a2a626 100644
--- a/epplets/E-Slides.c
+++ b/epplets/E-Slides.c
@@ -31,10 +31,8 @@
 #define D(x) ((void) 0)
 #endif
 
-#define PREV_PIC()      do {if (idx == 1) idx = image_cnt - 1; else if (idx == 0) idx = image_cnt - 2; else idx -= 2;} while (0)
-#define CUR_PIC()       ((idx == 0) ? (image_cnt - 1) : (idx - 1))
-#define NEXT_PIC()      ((void) 0)
-#define INC_PIC()       do {idx++; if (idx == image_cnt) idx = 0;} while (0)
+#define INC2PTR(i) ((void*)(long)(i))
+#define PTR2INC(p) ((int)(long)(p))
 
 #define AUTOBG_OFF      0
 #define AUTOBG_TILED    1
@@ -205,10 +203,9 @@ set_background(int tiled, int keep_aspect)
         current_desk = atoi(++ptr);
     free(reply);
 
-    snprintf(bg_name, sizeof(bg_name), "E_SLIDES_BG_%s", filenames[CUR_PIC()]);
+    snprintf(bg_name, sizeof(bg_name), "E_SLIDES_BG_%s", filenames[idx]);
 
-    Epplet_send_ipc("bg set %s bg.file %s/%s", bg_name, path,
-                    filenames[CUR_PIC()]);
+    Epplet_send_ipc("bg set %s bg.file %s/%s", bg_name, path, filenames[idx]);
     Epplet_send_ipc("bg set %s bg.solid 0 0 0", bg_name);
     Epplet_send_ipc("bg set %s bg.tile %d", bg_name, tiled);
     Epplet_send_ipc("bg set %s bg.keep_aspect %d", bg_name, keep_aspect);
@@ -221,33 +218,43 @@ set_background(int tiled, int keep_aspect)
 }
 
 static void
-change_image(void *data __UNUSED__)
+change_image(void *data)
 {
-    Imlib_Image    *im = NULL;
+    Imlib_Image    *im;
     double          ratio;
-    unsigned int    first = idx;
+    unsigned int    i, ii;
     int             new_w, new_h, new_x, new_y;
 
-    if (!filenames)
+    idx += PTR2INC(data);
+    idx = (image_cnt > 0) ? (idx + image_cnt) % image_cnt : 0;
+
+    if (image_cnt == 0 || !filenames)
         return;
 
     /* Test-load each image to make sure it's a valid image file. */
-    for (; ((!filenames[idx]) || (!(im = imlib_load_image(filenames[idx]))));)
+    im = NULL;
+    for (i = 0; i < image_cnt; i++)
     {
+        ii = (idx + i) % image_cnt;
+        if (!filenames[ii])
+            continue;
+        im = imlib_load_image(filenames[ii]);
+        if (im)
+            break;
         /* It isn't, so NULL out its name. */
         filenames[idx] = NULL;
-        INC_PIC();
-        if (idx == first)
-        {
-            /* They're all NULL now.  Time to give up. */
-            Epplet_dialog_ok
-                ("There don't seem to be any images in \"%s\".  Please choose another directory.\n",
-                 path);
-            Esync();
-            config_cb(NULL);
-            return;
-        }
     }
+    if (!im)
+    {
+        /* They're all NULL now. Time to give up. */
+        Epplet_dialog_ok
+            ("There don't seem to be any images in \"%s\".  Please choose another directory.\n",
+             path);
+        //Esync();
+        config_cb(NULL);
+        return;
+    }
+    idx = ii;
 
     new_w = (w * 16 - 6);
     new_h = (h * 16 - 6);
@@ -273,7 +280,6 @@ change_image(void *data __UNUSED__)
     Epplet_move_change_image(picture, new_x, new_y, new_w, new_h,
                              filenames[idx]);
 
-    INC_PIC();
     switch (auto_setbg)
     {
     case AUTOBG_TILED:
@@ -292,7 +298,7 @@ change_image(void *data __UNUSED__)
     Epplet_remove_timer("CHANGE_IMAGE");
     if (!paused)
     {
-        Epplet_timer(change_image, NULL, delay, "CHANGE_IMAGE");
+        Epplet_timer(change_image, INC2PTR(1), delay, "CHANGE_IMAGE");
     }
 }
 
@@ -307,7 +313,7 @@ zoom_cb(void *data __UNUSED__)
 {
     char            buff[1024];
 
-    snprintf(buff, sizeof(buff), zoom_cmd, filenames[CUR_PIC()]);
+    snprintf(buff, sizeof(buff), zoom_cmd, filenames[idx]);
     Epplet_spawn_command(buff);
 }
 
@@ -347,8 +353,7 @@ play_cb(void *data)
     {
     case -1:
         /* Previous image */
-        PREV_PIC();
-        change_image(NULL);
+        change_image(INC2PTR(-1));
         break;
     case 0:
         /* Pause */
@@ -362,12 +367,11 @@ play_cb(void *data)
         paused = 0;
         Epplet_gadget_hide(play_button);
         Epplet_gadget_show(pause_button);
-        change_image(NULL);
+        change_image(INC2PTR(0));
         break;
     case 2:
         /* Next image */
-        NEXT_PIC();
-        change_image(NULL);
+        change_image(INC2PTR(1));
         break;
     default:
         break;
@@ -514,7 +518,7 @@ apply_config(void)
     maintain_aspect = cfg_maintain_aspect;
     sprintf(buff, "%d", maintain_aspect);
     Epplet_modify_config("maintain_aspect", buff);
-    change_image(NULL);
+    change_image(INC2PTR(0));
 }
 
 static void
@@ -732,7 +736,7 @@ main(int argc, char **argv)
 
     if (get_images(path))
     {
-        change_image(NULL);
+        change_image(INC2PTR(0));
     }
     else
     {

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

Reply via email to