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().
This commit is contained in:
Asher Gordon
2019-12-24 00:44:30 -05:00
committed by Simon Tatham
parent 1c0c49dd5c
commit ce69911077

33
gtk.c
View File

@ -2395,18 +2395,31 @@ static void menu_about_event(GtkMenuItem *menuitem, gpointer data)
frontend *fe = (frontend *)data; frontend *fe = (frontend *)data;
#if GTK_CHECK_VERSION(3,0,0) #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 char *const *const xpm_icons[];
extern const int n_xpm_icons; extern const int n_xpm_icons;
GdkPixbuf *icon = gdk_pixbuf_new_from_xpm_data
((const gchar **)xpm_icons[n_xpm_icons-1]); if (n_xpm_icons) {
gtk_show_about_dialog GdkPixbuf *icon = gdk_pixbuf_new_from_xpm_data
(GTK_WINDOW(fe->window), ((const gchar **)xpm_icons[n_xpm_icons-1]);
"program-name", thegame.name,
"version", ver, gtk_show_about_dialog
"comments", "Part of Simon Tatham's Portable Puzzle Collection", (GTK_WINDOW(fe->window),
"logo", icon, ABOUT_PARAMS,
(const gchar *)NULL); "logo", icon,
g_object_unref(G_OBJECT(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 #else
char titlebuf[256]; char titlebuf[256];
char textbuf[1024]; char textbuf[1024];