1
0
mirror of https://github.com/gryf/wmaker.git synced 2025-12-19 12:28:22 +01:00

Prevent a WPrefs segfault

Prevent WPrefs (menu panel) segfaulting upon coming by an invalid command in
the root menu.

Reported and first patch version by Bento Loewenstein.

Signed-off-by: Tamas TEVESZ <ice@extreme.hu>
This commit is contained in:
Tamas TEVESZ
2010-09-17 20:57:50 +02:00
committed by Carlos R. Mafra
parent 09c56140a2
commit 35ed80648b

View File

@@ -509,7 +509,7 @@ static void createPanel(_Panel * p)
data->param.exec.command = "eterm"; data->param.exec.command = "eterm";
data = putNewItem(panel, pad, ExecInfo, _("Run...")); data = putNewItem(panel, pad, ExecInfo, _("Run..."));
data->param.exec.command = _("%a(Run,Type command to run)"); data->param.exec.command = _("%A(Run,Type command to run)");
data = putNewItem(panel, pad, ExecInfo, _("Netscape")); data = putNewItem(panel, pad, ExecInfo, _("Netscape"));
data->param.exec.command = "netscape"; data->param.exec.command = "netscape";
@@ -1030,7 +1030,8 @@ static ItemData *parseCommand(WMPropList * item)
cmd = 11; cmd = 11;
} else { } else {
wwarning(_("unknown command '%s' in menu"), command); wwarning(_("unknown command '%s' in menu"), command);
goto error; wfree(data);
return NULL;
} }
data->type = CommandInfo; data->type = CommandInfo;
@@ -1043,11 +1044,6 @@ static ItemData *parseCommand(WMPropList * item)
} }
return data; return data;
error:
wfree(data);
return NULL;
} }
static void updateFrameTitle(_Panel * panel, char *title, InfoType type) static void updateFrameTitle(_Panel * panel, char *title, InfoType type)
@@ -1396,13 +1392,22 @@ static WEditMenu *buildSubmenu(_Panel * panel, WMPropList * pl)
} else { } else {
ItemData *data; ItemData *data;
item = WAddMenuItemWithTitle(menu, title);
data = parseCommand(pi); data = parseCommand(pi);
if (panel->markerPix[data->type]) if (data != NULL) {
WSetEditMenuItemImage(item, panel->markerPix[data->type]); item = WAddMenuItemWithTitle(menu, title);
WSetEditMenuItemData(item, data, (WMCallback *) freeItemData); if (panel->markerPix[data->type])
WSetEditMenuItemImage(item, panel->markerPix[data->type]);
WSetEditMenuItemData(item, data, (WMCallback *) freeItemData);
} else {
char *buf = wmalloc(1024);
snprintf(buf, 1024, _("Invalid menu command \"%s\" with label \"%s\" cleared"),
WMGetFromPLString(WMGetFromPLArray(pi, 1)),
WMGetFromPLString(WMGetFromPLArray(pi, 0)));
WMRunAlertPanel(scr, panel->parent, _("Warning"), buf, _("OK"), NULL, NULL);
wfree(buf);
}
} }
} }
@@ -1509,6 +1514,9 @@ static WMPropList *processData(char *title, ItemData * data)
static WMPropList *pomenu = NULL; static WMPropList *pomenu = NULL;
int i; int i;
if (data == NULL)
return NULL;
if (!pscut) { if (!pscut) {
pscut = WMCreatePLString("SHORTCUT"); pscut = WMCreatePLString("SHORTCUT");
pomenu = WMCreatePLString("OPEN_MENU"); pomenu = WMCreatePLString("OPEN_MENU");
@@ -1638,7 +1646,7 @@ static WMPropList *processSubmenu(WEditMenu * menu)
pmenu = WMCreatePLArray(pl, NULL); pmenu = WMCreatePLArray(pl, NULL);
i = 0; i = 0;
while ((item = WGetEditMenuItem(menu, i++))) { while (item = WGetEditMenuItem(menu, i++)) {
WEditMenu *submenu; WEditMenu *submenu;
s = WGetEditMenuItemTitle(item); s = WGetEditMenuItemTitle(item);