shithub: puzzles

Download patch

ref: ce69911077ce1399ae3626c9f66737c4586db18a
parent: 1c0c49dd5cd8df6ae87f7be5371be84589fa2662
author: Asher Gordon <AsDaGo@posteo.net>
date: Mon Dec 23 19:44:30 EST 2019

Don't segfault when no icons are available.

When no icons are available, n_xpm_icons will be 0, and
menu_about_event() will try to access xpm_icons[n_xpm_icons-1]. Since
n_xpm_icons is 0, this becomes xpm_icons[-1] which is an invalid
value, causing a segfault.

Instead, check if n_xpm_icons is 0, and if so, don't pass any icon to
gtk_show_about_dialog().

--- a/gtk.c
+++ b/gtk.c
@@ -2395,18 +2395,31 @@
     frontend *fe = (frontend *)data;
 
 #if GTK_CHECK_VERSION(3,0,0)
+# define ABOUT_PARAMS                                               \
+    "program-name", thegame.name,                                   \
+    "version", ver,                                                 \
+    "comments", "Part of Simon Tatham's Portable Puzzle Collection"
+
     extern char *const *const xpm_icons[];
     extern const int n_xpm_icons;
-    GdkPixbuf *icon = gdk_pixbuf_new_from_xpm_data
-        ((const gchar **)xpm_icons[n_xpm_icons-1]);
-    gtk_show_about_dialog
-        (GTK_WINDOW(fe->window),
-         "program-name", thegame.name,
-         "version", ver,
-         "comments", "Part of Simon Tatham's Portable Puzzle Collection",
-         "logo", icon,
-         (const gchar *)NULL);
-    g_object_unref(G_OBJECT(icon));
+
+    if (n_xpm_icons) {
+        GdkPixbuf *icon = gdk_pixbuf_new_from_xpm_data
+            ((const gchar **)xpm_icons[n_xpm_icons-1]);
+
+        gtk_show_about_dialog
+            (GTK_WINDOW(fe->window),
+             ABOUT_PARAMS,
+             "logo", icon,
+             (const gchar *)NULL);
+        g_object_unref(G_OBJECT(icon));
+    }
+    else {
+        gtk_show_about_dialog
+            (GTK_WINDOW(fe->window),
+             ABOUT_PARAMS,
+             (const gchar *)NULL);
+    }
 #else
     char titlebuf[256];
     char textbuf[1024];