From 422f5fa6f962e649cabe851c0390402f2b87e0f0 Mon Sep 17 00:00:00 2001 From: Steffen Jaeckel Date: Tue, 18 Mar 2025 13:00:01 +0100 Subject: [PATCH] Slightly improve http_download related allocations. * use `calloc()` to allocate zero-initialized structs. * order the allocation of members by their declaration. * order the freeing of members in reverse order. * move init of `silent` flag in plugin case. * fix double free of `tmpname` in `aesgcm_file_get()`. * make some functions static. Signed-off-by: Steffen Jaeckel --- src/command/cmd_funcs.c | 25 ++++++++++++------------- src/tools/aesgcm_download.c | 5 ++--- src/tools/http_download.c | 4 ++-- src/tools/plugin_download.c | 2 +- 4 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index 51439237..5a3c2307 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -9435,17 +9435,16 @@ _url_aesgcm_method(ProfWin* window, const char* cmd_template, gchar* url, gchar* auto_gchar gchar* filename = _prepare_filename(window, url, path); if (!filename) return; - auto_char char* id = get_random_string(4); - AESGCMDownload* download = malloc(sizeof(AESGCMDownload)); - download->window = window; + AESGCMDownload* download = calloc(1, sizeof(AESGCMDownload)); + download->id = get_random_string(4); download->url = strdup(url); download->filename = strdup(filename); - download->id = strdup(id); if (cmd_template != NULL) { download->cmd_template = strdup(cmd_template); } else { download->cmd_template = NULL; } + download->window = window; pthread_create(&(download->worker), NULL, &aesgcm_file_get, download); aesgcm_download_add_download(download); @@ -9458,38 +9457,38 @@ _download_install_plugin(ProfWin* window, gchar* url, gchar* path) auto_gchar gchar* filename = _prepare_filename(window, url, path); if (!filename) return FALSE; - HTTPDownload* download = malloc(sizeof(HTTPDownload)); - download->window = window; + HTTPDownload* download = calloc(1, sizeof(HTTPDownload)); + download->id = get_random_string(4); download->url = strdup(url); download->filename = strdup(filename); - download->id = get_random_string(4); download->cmd_template = NULL; + download->window = window; + download->silent = TRUE; pthread_create(&(download->worker), NULL, &plugin_download_install, download); plugin_download_add_download(download); return TRUE; } -void +static void _url_http_method(ProfWin* window, const char* cmd_template, gchar* url, gchar* path) { auto_gchar gchar* filename = _prepare_filename(window, url, path); if (!filename) return; - auto_char char* id = get_random_string(4); - HTTPDownload* download = malloc(sizeof(HTTPDownload)); - download->window = window; + HTTPDownload* download = calloc(1, sizeof(HTTPDownload)); + download->id = get_random_string(4); download->url = strdup(url); download->filename = strdup(filename); - download->id = strdup(id); download->cmd_template = cmd_template ? strdup(cmd_template) : NULL; + download->window = window; download->silent = FALSE; pthread_create(&(download->worker), NULL, &http_file_get, download); http_download_add_download(download); } -void +static void _url_external_method(const char* cmd_template, const char* url, gchar* filename) { auto_gcharv gchar** argv = format_call_external_argv(cmd_template, url, filename); diff --git a/src/tools/aesgcm_download.c b/src/tools/aesgcm_download.c index 6aa56013..4e10c286 100644 --- a/src/tools/aesgcm_download.c +++ b/src/tools/aesgcm_download.c @@ -77,7 +77,7 @@ aesgcm_file_get(void* userdata) // Create a temporary file used for storing the ciphertext that is to be // retrieved from the https:// URL. - auto_gchar char* tmpname = NULL; + auto_gchar gchar* tmpname = NULL; auto_gfd gint tmpfd = 0; if ((tmpfd = g_file_open_tmp("profanity.XXXXXX", &tmpname, NULL)) == -1) { http_print_transfer_update(aesgcm_dl->window, aesgcm_dl->id, @@ -101,7 +101,7 @@ aesgcm_file_get(void* userdata) // We wrap the HTTPDownload tool and use it for retrieving the ciphertext // and storing it in the temporary file previously opened. - HTTPDownload* http_dl = malloc(sizeof(HTTPDownload)); + HTTPDownload* http_dl = calloc(1, sizeof(HTTPDownload)); http_dl->window = aesgcm_dl->window; http_dl->worker = aesgcm_dl->worker; http_dl->id = strdup(aesgcm_dl->id); @@ -128,7 +128,6 @@ aesgcm_file_get(void* userdata) http_dl->bytes_received, fragment); remove(tmpname); - g_free(tmpname); if (crypt_res != GPG_ERR_NO_ERROR) { http_print_transfer_update(aesgcm_dl->window, aesgcm_dl->id, diff --git a/src/tools/http_download.c b/src/tools/http_download.c index 9058ae28..b9f47837 100644 --- a/src/tools/http_download.c +++ b/src/tools/http_download.c @@ -236,9 +236,9 @@ out: download_processes = g_slist_remove(download_processes, download); pthread_mutex_unlock(&lock); - free(download->id); - free(download->url); free(download->filename); + free(download->url); + free(download->id); free(download); return NULL; diff --git a/src/tools/plugin_download.c b/src/tools/plugin_download.c index 99176ec2..d2eae004 100644 --- a/src/tools/plugin_download.c +++ b/src/tools/plugin_download.c @@ -62,9 +62,9 @@ plugin_download_install(void* userdata) { HTTPDownload* plugin_dl = (HTTPDownload*)userdata; + /* We need to dup those, because they're free'd inside `http_file_get()` */ auto_char char* path = strdup(plugin_dl->filename); auto_char char* https_url = strdup(plugin_dl->url); - plugin_dl->silent = TRUE; http_file_get(plugin_dl);