Fix memory leaks when parsing user commands.

This commit is contained in:
Jan Vidar Krey 2011-12-09 16:54:48 +01:00
parent 9377fb537a
commit aec89fc125
1 changed files with 19 additions and 16 deletions

View File

@ -231,6 +231,7 @@ static int command_parse(struct command_base* cbase, struct hub_user* user, cons
{
char* prefix;
int n;
int ret;
struct hub_command* cmd = hub_malloc_zero(sizeof(struct hub_command));
struct command_handle* handler = NULL;
struct linked_list* tokens = NULL;
@ -244,9 +245,8 @@ static int command_parse(struct command_base* cbase, struct hub_user* user, cons
n = split_string(message, "\\s", tokens, 0);
if (n <= 0)
{
command_destroy(cmd);
// FIXME
return 0;
ret = 0; // FIXME
goto command_parse_cleanup;
}
// Find a matching command handler
@ -258,14 +258,14 @@ static int command_parse(struct command_base* cbase, struct hub_user* user, cons
handler = command_handler_lookup(cbase, cmd->prefix);
if (!handler)
{
return command_not_found(cbase, user, prefix);
ret = command_not_found(cbase, user, prefix);
goto command_parse_cleanup;
}
}
else
{
command_destroy(cmd);
command_syntax_error(cbase, user);
return 0;
ret = command_syntax_error(cbase, user);
goto command_parse_cleanup;
}
// Remove the first token.
@ -274,27 +274,30 @@ static int command_parse(struct command_base* cbase, struct hub_user* user, cons
// Parse arguments
cmd->args = command_extract_arguments(cbase, handler, tokens);
list_clear(tokens, &hub_free);
list_destroy(tokens);
if (!cmd->args)
{
command_destroy(cmd);
// FIXME
return 0;
ret = 0;
goto command_parse_cleanup;
}
if (command_is_available(handler, user))
{
handler->handler(cbase, user, handler, cmd);
command_destroy(cmd);
return 0;
ret = 0;
goto command_parse_cleanup;
}
else
{
command_destroy(cmd);
return command_access_denied(cbase, user, prefix);
ret = command_access_denied(cbase, user, prefix);
goto command_parse_cleanup;
}
command_parse_cleanup:
command_destroy(cmd);
list_clear(tokens, &hub_free);
list_destroy(tokens);
return ret;
}
const char* command_get_syntax(struct command_handle* handler)