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];