rem: free(ctokens);
add: wfree(ctokens);
context: parseCommand(proplist_t item){    ItemData *data = NEW(ItemData);    proplist_t p;    char *command = NULL;    char *parameter = NULL;    char *shortcut = NULL;    int i = 1;            p = PLGetArrayElement(item, i++);    command = PLGetString(p);    if (strcmp(command, "SHORTCUT") == 0) {	p = PLGetArrayElement(item, i++);	shortcut = PLGetString(p);	p = PLGetArrayElement(item, i++);	command = PLGetString(p);    }    p = PLGetArrayElement(item, i++);    if (p)	parameter = PLGetString(p);    if (strcmp(command, "EXEC") == 0 || strcmp(command, "SHEXEC") == 0) {		data->type = ExecInfo;		data->param.exec.command = wstrdup(parameter);	if (shortcut)	    data->param.exec.shortcut = wstrdup(shortcut);	    } else if (strcmp(command, "OPEN_MENU") == 0) {	char *p;	/*	 * dir menu, menu file	 * dir WITH	 * |pipe (TODO: ||pipe)	 */	p = parameter;	while (isspace(*p) && *p) p++;	if (*p == '|') {	    data->type = PipeInfo;	    data->param.pipe.command = wtrimspace(p+1);	} else {	    char *s;	    p = wstrdup(p);	    	    s = strstr(p, "WITH");	    if (s) {		char **tokens;		char **ctokens;		int tokn;		int i, j;		data->type = DirectoryInfo;				*s = '\0';		s += 5;		while (*s && isspace(*s)) s++;		data->param.directory.command = wstrdup(s);				wtokensplit(p, &tokens, &tokn);		free(p);				ctokens = wmalloc(sizeof(char*)*tokn);		for (i = 0, j = 0; i < tokn; i++) {		    if (strcmp(tokens[i], "-noext") == 0) {			free(tokens[i]);			data->param.directory.stripExt = 1;		    } else {			ctokens[j++] = tokens[i];		    }		}		data->param.directory.directory = wtokenjoin(ctokens, j);		free(ctokens);		wtokenfree(tokens, tokn);	    } else {		data->type = ExternalInfo;		data->param.external.path = p;	    }	}    } else if (strcmp(command, "WORKSPACE_MENU") == 0) {	data->type = WSMenuInfo;    } else {	int cmd;	if (strcmp(command, "ARRANGE_ICONS") == 0) {	    cmd = 0;	} else if (strcmp(command, "HIDE_OTHERS") == 0) {	    cmd = 1;	} else if (strcmp(command, "SHOW_ALL") == 0) {	    cmd = 2;	} else if (strcmp(command, "EXIT") == 0) {	    cmd = 3;	} else if (strcmp(command, "SHUTDOWN") == 0) {	    cmd = 4;	} else if (strcmp(command, "RESTART") == 0) {	    if (parameter) {		cmd = 6;	    } else {		cmd = 5;	    }	} else if (strcmp(command, "SAVE_SESSION") == 0) {	    cmd = 7;	} else if (strcmp(command, "CLEAR_SESSION") == 0) {	    cmd = 8;	} else if (strcmp(command, "REFRESH") == 0) {	    cmd = 9;	} else if (strcmp(command, "INFO_PANEL") == 0) {	    cmd = 10;	} else if (strcmp(command, "LEGAL_PANEL") == 0) {	    cmd = 11;	} else {	    wwarning(_("unknown command '%s' in menu"), command);	    goto error;	}	data->type = CommandInfo;	data->param.command.command = cmd;	if (shortcut)	    data->param.command.shortcut = wstrdup(shortcut);	if (parameter)	    data->param.command.parameter = wstrdup(parameter);    }    return data;error:    free(data);    return NULL;}