From 665939cd1fdfc738c8f86d586d8ad015898c359b Mon Sep 17 00:00:00 2001 From: Kubat <mael.martin31@gmail.com> Date: Thu, 18 Nov 2021 20:23:02 +0100 Subject: [PATCH] LEAK: Avoid memory leaks on invalid URI --- src/base/commands.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/base/commands.c b/src/base/commands.c index 5bbd9cfa..d952cfcb 100644 --- a/src/base/commands.c +++ b/src/base/commands.c @@ -730,31 +730,39 @@ bool command_find(struct lkt_state *srv, size_t c, char *args[LKT_MESSAGE_ARGS_MAX], long continuation, database_search_init_func init) { - long count; - struct lkt_uri *find_uri = lkt_uri_new(); - struct lkt_search *search = - database_search_new(srv, c, (int)continuation, FUNCTION_POINTER(lkt_callback_send_row_v2)); - database_search_set_uri(search, find_uri); - database_search_set_name(search, args[0]); - RETURN_UNLESS(args[0], "Invalid argument", false); /* Just an id */ + long count; if (!args[1] && (count = strtol(args[0], NULL, 0))) return command_findid(srv, c, args[0]); /* With an URI */ + struct lkt_uri *find_uri = lkt_uri_new(); + struct lkt_search *search = + database_search_new(srv, c, (int)continuation, FUNCTION_POINTER(lkt_callback_send_row_v2)); + database_search_set_name(search, args[0]); + database_search_set_uri(search, find_uri); + if (!lkt_uri_from(find_uri, args)) { /* Try from idx 1, in case of playlust searches */ LOG_DEBUG("COMMAND", "URI may not starts at idx 0, may be because of " "playlist search. At idx 0, value was '%s'", args[0]); - RETURN_UNLESS(lkt_uri_from(find_uri, &args[1]), "Failed to create the uri", false); + unless (lkt_uri_from(find_uri, &args[1])) { + lkt_uri_free(find_uri); + LOG_ERROR("COMMAND", "Failed to create the uri"); + return false; + } + } + + unless (init(srv->db, search)) { + LOG_ERROR("COMMAND", "Failed to init the search structure"); + lkt_uri_free(find_uri); + return false; } - database_search_set_uri(search, find_uri); - RETURN_UNLESS(init(srv->db, search), "Failed to init search", false); const bool ret = iter_search__(search); lkt_uri_free(find_uri); return ret; -- GitLab