From 8f94f4d5bae73a493991b141199c44e37adb59ac Mon Sep 17 00:00:00 2001 From: Kubat <mael.martin31@gmail.com> Date: Sun, 23 May 2021 20:55:02 +0200 Subject: [PATCH] MISC: Add macros to wrap the malloc calls and automatically cast into the right pointer type Doing this some errors were found: - malloc not the right size, works because the malloc'ed struct was bigger - const/volatile correctness forced -> explicit with the malloc macro --- inc/lektor/common.h | 6 ++++++ inc/lektor/queue.h | 2 +- src/base/commands.c | 2 +- src/base/stack.c | 2 +- src/base/uri.c | 2 +- src/database/find.c | 6 +++--- src/database/open.c | 2 +- src/database/update.c | 2 +- src/main/server.c | 7 +++++-- src/mkv/utils.c | 2 +- src/module/module_repo.c | 16 ++++++++-------- src/module/module_sdl2.c | 2 +- src/module/thread.h | 2 +- src/module/worker.c | 6 +++--- src/net/listen.c | 10 +++++----- src/net/message.c | 2 +- 16 files changed, 40 insertions(+), 31 deletions(-) diff --git a/inc/lektor/common.h b/inc/lektor/common.h index 5e80b94b..4dad1e62 100644 --- a/inc/lektor/common.h +++ b/inc/lektor/common.h @@ -207,6 +207,12 @@ int safe_snprintf(char *dest, const size_t max_len, const char *format, ...); int safe_vsnprintf(char *dest, const size_t max_len, const char *format, va_list); char *safe_strncpy(char *dest, const char *src, size_t n); +/* Helpers for malloc functions. */ +#define LKT_ALLOC(___struct___) (___struct___ *)safe_malloc(sizeof(___struct___)) +#define LKT_ALLOC_STRUCT(___struct___) LKT_ALLOC(struct ___struct___) +#define LKT_ALLOC_ARRAY(___struct___, ___count___) (___struct___ *) safe_malloc(sizeof(___struct___) * (___count___)) +#define LKT_ALLOC_STRUCT_ARRAY(___struct___, ___count___) LKT_ALLOC_ARRAY(struct ___struct___, ___count___) + /* Iterate throught a string, copy each element in the dest string. The save ptr must contains a null integer. */ int iter_string(const char *str, const char *sep, char *dest, const size_t dest_len, size_t *save); diff --git a/inc/lektor/queue.h b/inc/lektor/queue.h index 0c03c075..63342d02 100644 --- a/inc/lektor/queue.h +++ b/inc/lektor/queue.h @@ -83,7 +83,7 @@ lkt_queue_new(struct queue *ret) pthread_mutex_t mxt = PTHREAD_MUTEX_INITIALIZER; struct queue _ret = { - .contents = safe_malloc(LKT_DEFAULT_LIST_SIZE * sizeof(lkt_event)), + .contents = LKT_ALLOC_ARRAY(lkt_event, LKT_DEFAULT_LIST_SIZE), .size = LKT_DEFAULT_LIST_SIZE, .last = 0, .available = 0, diff --git a/src/base/commands.c b/src/base/commands.c index ad5bfb3e..a520b1a7 100644 --- a/src/base/commands.c +++ b/src/base/commands.c @@ -25,7 +25,7 @@ command_restart(struct lkt_state *srv, size_t c, char UNUSED *__argv[LKT_MESSAGE env_set(LKT_ENV_RESTART, "1"); int len = long_length(LONG_MAX); if (len > 0) { - char *pos = safe_malloc(len * sizeof(char)); + char *pos = LKT_ALLOC_ARRAY(char, len); safe_snprintf(pos, len, "%d", sta.current); env_set(LKT_ENV_CURRENT, pos); free(pos); diff --git a/src/base/stack.c b/src/base/stack.c index 02123ebe..6071f079 100644 --- a/src/base/stack.c +++ b/src/base/stack.c @@ -9,7 +9,7 @@ stack_new(struct stack *ret) assert(ret); struct stack _ret = { - .contents = safe_malloc(LKT_DEFAULT_LIST_SIZE * sizeof(void *)), + .contents = LKT_ALLOC_ARRAY(volatile void *, LKT_DEFAULT_LIST_SIZE), .size = LKT_DEFAULT_LIST_SIZE, .len = 0, }; diff --git a/src/base/uri.c b/src/base/uri.c index e07866c9..cc8b9b15 100644 --- a/src/base/uri.c +++ b/src/base/uri.c @@ -93,7 +93,7 @@ lkt_uri_from_list(struct lkt_uri *ret, char **list) if ('\0' == *(char *)ret->value) return false; - char *buffer = (char *)safe_malloc(sizeof(char) * (strlen(ret->value) + 1)); + char *buffer = LKT_ALLOC_ARRAY(char, strlen(ret->value) + 1); strcpy(buffer, ret->value); for (i = 1; list[i]; ++i) { diff --git a/src/database/find.c b/src/database/find.c index 5d905a51..192b7c3d 100644 --- a/src/database/find.c +++ b/src/database/find.c @@ -77,7 +77,7 @@ database_search_new(struct lkt_state *srv, size_t c, int cont, function_ptr call { /* Minus 3 for control messages. If no server do it `X` by `X`. */ size_t msg_count = srv != NULL ? lkt_remaining_msg(srv, c) - 3 : LKT_DB_DEFAULT_ITERATION_MAX; - struct lkt_search *ret_ptr = safe_malloc(sizeof(struct lkt_search)); + struct lkt_search *ret_ptr = LKT_ALLOC_STRUCT(lkt_search); struct lkt_search ret = { .srv = srv, .c = c, @@ -95,7 +95,7 @@ database_search_new(struct lkt_state *srv, size_t c, int cont, function_ptr call struct lkt_search * database_search_new_from(struct lkt_search *from) { - struct lkt_search *ret_ptr = safe_malloc(sizeof(struct lkt_search)); + struct lkt_search *ret_ptr = LKT_ALLOC_STRUCT(lkt_search); memcpy(ret_ptr, from, sizeof(struct lkt_search)); ret_ptr->stmt = NULL; /* Omit that one, the returned search is not initialized. */ return ret_ptr; @@ -415,7 +415,7 @@ ___get_all_kara(lkt_db *db, int **ret_ids, size_t *ret_ids_len, const char *SQL_ } sqlite3_finalize(stmt); stmt = NULL; - *ret_ids = (int *)safe_malloc((*ret_ids_len) * sizeof(int)); + *ret_ids = LKT_ALLOC_ARRAY(int, *ret_ids_len); /* Get all the IDs */ SQLITE_PREPARE(db, stmt, SQL_DATA, error); diff --git a/src/database/open.c b/src/database/open.c index ff1be74c..1d99f29d 100644 --- a/src/database/open.c +++ b/src/database/open.c @@ -72,7 +72,7 @@ ___inc(lkt_db *db, const char *name, bool check) db_stack_init = 1; } - struct named_db *item = safe_malloc(sizeof(struct stack)); + struct named_db *item = LKT_ALLOC_STRUCT(named_db); item->name = strdup(name); item->db = db; stack_push(&db_stack, item); diff --git a/src/database/update.c b/src/database/update.c index 09235c94..79b62450 100644 --- a/src/database/update.c +++ b/src/database/update.c @@ -257,7 +257,7 @@ database_deleted_kara(lkt_db *db, int **kara_id, size_t *len) static const char *SQL = "SELECT kara.id, file_path FROM kara WHERE kara.id NOT IN" "(SELECT kara_id FROM updates JOIN misc ON job = update_job);"; sqlite3_stmt *stmt = NULL; - *kara_id = (int *)safe_malloc(LKT_DEFAULT_LIST_SIZE * sizeof(int)); + *kara_id = LKT_ALLOC_ARRAY(int, LKT_DEFAULT_LIST_SIZE); *len = 0; RETURN_UNLESS(*kara_id, "Out of memory", NOTHING); SQLITE_PREPARE(db, stmt, SQL, out); diff --git a/src/main/server.c b/src/main/server.c index 9ccaa832..8eb87d83 100644 --- a/src/main/server.c +++ b/src/main/server.c @@ -96,8 +96,11 @@ main(int argc, char *argv[]) RETURN_UNLESS(setlocale(LC_CTYPE, ""), "Failed to set LC_CTYPE", 1); RETURN_UNLESS(setlocale(LC_NUMERIC, "C"), "Failed to set LC_NUMERIC for mpv", 1); - int autoclear, check_exclusive = 1, opt, dump_and_abort = 0; - char *conf_file = safe_malloc(PATH_MAX * sizeof(char)); + int autoclear; + int opt; + int check_exclusive = 1; + int dump_and_abort = 0; + char *conf_file = LKT_ALLOC_ARRAY(char, PATH_MAX); cmd_set_executable_name("lektord"); /* Check args */ diff --git a/src/mkv/utils.c b/src/mkv/utils.c index d998ddff..904785e1 100644 --- a/src/mkv/utils.c +++ b/src/mkv/utils.c @@ -9,7 +9,7 @@ mdtcat(struct kara_metadata *mdt, char **ret) size_t size = strlen(mdt->song_name) + strlen(mdt->source_name) + strlen(mdt->category) + strlen(mdt->language) + strlen(mdt->author_name) + strlen(mdt->song_type) + /* Null byte */ 1 + /* Separators */ 12 + 5 + long_length(mdt->song_number); - *ret = safe_malloc(sizeof(char) * size); + *ret = LKT_ALLOC_ARRAY(char, size); safe_snprintf(*ret, size, "%s - %s / %s - %s%d - %s [%s]", mdt->category, mdt->language, mdt->source_name, mdt->song_type, mdt->song_number, mdt->song_name, mdt->author_name); } diff --git a/src/module/module_repo.c b/src/module/module_repo.c index d3276b67..7ad0de78 100644 --- a/src/module/module_repo.c +++ b/src/module/module_repo.c @@ -752,13 +752,13 @@ module_repo_new(struct module_repo_internal *repo_, struct queue *queue, lkt_db .queue = queue, .db = db, .updating = 0, - .name = safe_malloc(LKT_LINE_MAX * sizeof(char)), - .kara_dir = safe_malloc(PATH_MAX * sizeof(char)), - .get_id_json = safe_malloc(LKT_LINE_MAX * sizeof(char)), - .get_id_file = safe_malloc(LKT_LINE_MAX * sizeof(char)), - .get_fav_json = safe_malloc(LKT_LINE_MAX * sizeof(char)), - .get_all_json = safe_malloc(LKT_LINE_MAX * sizeof(char)), - .base_url = safe_malloc(LKT_LINE_MAX * sizeof(char)), + .name = LKT_ALLOC_ARRAY(char, LKT_LINE_MAX), + .kara_dir = LKT_ALLOC_ARRAY(char, PATH_MAX), + .get_id_json = LKT_ALLOC_ARRAY(char, LKT_LINE_MAX), + .get_id_file = LKT_ALLOC_ARRAY(char, LKT_LINE_MAX), + .get_fav_json = LKT_ALLOC_ARRAY(char, LKT_LINE_MAX), + .get_all_json = LKT_ALLOC_ARRAY(char, LKT_LINE_MAX), + .base_url = LKT_ALLOC_ARRAY(char, LKT_LINE_MAX), .craft_filename = obfuscate ? ___craft_filename_obfuscate : ___craft_filename_non_obfuscate, }; @@ -806,7 +806,7 @@ mod_new(va_list *va) LOG_ERROR("REPO", "Can't init two times the module"); return 1; } - *repo = safe_malloc(sizeof(struct module_repo_internal)); + *repo = LKT_ALLOC_STRUCT(module_repo_internal); bool ret = module_repo_new(*repo, queue, db); lkt_queue_make_available(queue, LKT_EVENT_DB_UPDATING); diff --git a/src/module/module_sdl2.c b/src/module/module_sdl2.c index 91aa7c16..9330844e 100644 --- a/src/module/module_sdl2.c +++ b/src/module/module_sdl2.c @@ -480,7 +480,7 @@ module_sdl2_new(struct module_sdl2_window **win, struct queue *queue, lkt_db *db (*win)->set_seek = -1; /* Start the SDL thread */ - arg = safe_malloc(sizeof(struct poller_thread_arg)); + arg = LKT_ALLOC_STRUCT(poller_thread_arg); RETURN_UNLESS(arg, "Out of memory", false); arg->args = *win; RETURN_IF(poller_new(&(*win)->self, sdl_thread__, arg), "Failed to launch the SDL thread", false); diff --git a/src/module/thread.h b/src/module/thread.h index 4a712955..5c2907b5 100644 --- a/src/module/thread.h +++ b/src/module/thread.h @@ -54,7 +54,7 @@ poller_new(struct poller_thread *th, void *(*func)(struct poller_thread_arg *), struct ___poller_thread_args *__args; *th = th_; - __args = safe_malloc(sizeof(struct ___poller_thread_args)); + __args = LKT_ALLOC_STRUCT(___poller_thread_args); __args->start = func; __args->arg = args; __args->arg->self = th; diff --git a/src/module/worker.c b/src/module/worker.c index 509f6a79..2c248723 100644 --- a/src/module/worker.c +++ b/src/module/worker.c @@ -73,9 +73,9 @@ worker_pool_new(struct worker_pool *ret, size_t init_size, size_t thread_count) if (!thread_count) thread_count = get_nprocs_conf(); struct worker_pool __ret = { - .functions = safe_malloc(sizeof(worker_function) * init_size), - .args = safe_malloc(sizeof(void *) * init_size), - .threads = safe_malloc(sizeof(pthread_t) * thread_count), + .functions = LKT_ALLOC_ARRAY(worker_function, init_size), + .args = LKT_ALLOC_ARRAY(volatile void *, init_size), + .threads = LKT_ALLOC_ARRAY(pthread_t, thread_count), .size = init_size, .thread_size = thread_count, .len = 0u, diff --git a/src/net/listen.c b/src/net/listen.c index 2b36e961..4e2ec3ed 100644 --- a/src/net/listen.c +++ b/src/net/listen.c @@ -45,7 +45,7 @@ static struct cmd_trie_node *cmd_trie_root = NULL; PRIVATE_FUNCTION struct cmd_trie_node * cmd_trie_new(void) { - struct cmd_trie_node *ret = safe_malloc(sizeof(struct cmd_trie_node)); + struct cmd_trie_node *ret = LKT_ALLOC_STRUCT(cmd_trie_node); for (size_t i = 0; i < CHARS_MAX; ++i) { ret->children[i] = NULL; @@ -1007,7 +1007,7 @@ redo: // clang-format off switch (evt.type) { __CASE(PLAY_POS, { - string = safe_malloc(BUFFER_MAX * sizeof(char)); + string = LKT_ALLOC_ARRAY(char, BUFFER_MAX); safe_snprintf(string, BUFFER_MAX, "%ld", (size_t)evt.attr); command_play(srv, &string); free(string); @@ -1026,7 +1026,7 @@ redo: __CASE(PROP_TIME, database_config_queue(srv->db, "elapsed", (size_t)evt.attr)) __CASE(SKIP_CURRENT, { - string = safe_malloc(PATH_MAX * sizeof(char)); + string = LKT_ALLOC_ARRAY(char, PATH_MAX); database_queue_skip_current(srv->db, string); MOD_CALL(srv->window_mod, "load", string); free(string); @@ -1161,8 +1161,8 @@ lkt_listen(struct lkt_state *srv) assert(database_config_get(srv->db, "server", "max_clients", &fds_max_config)); srv->fds_max = fds_max_config; - srv->fds = safe_malloc(srv->fds_max * sizeof(struct pollfd)); - srv->clients = safe_malloc(srv->fds_max * sizeof(struct lkt_client)); + srv->fds = LKT_ALLOC_STRUCT_ARRAY(pollfd, srv->fds_max); + srv->clients = LKT_ALLOC_STRUCT_ARRAY(lkt_client, srv->fds_max); LOG_INFO("INIT", "Register signal handlers for signals..."); srv->__signal_INT = __lkt_handle_INT; diff --git a/src/net/message.c b/src/net/message.c index ccceb0d9..ebc5ea82 100644 --- a/src/net/message.c +++ b/src/net/message.c @@ -12,7 +12,7 @@ struct lkt_message { struct lkt_message * lkt_message_new(void) { - struct lkt_message *res = safe_malloc(sizeof(struct lkt_message)); + struct lkt_message *res = LKT_ALLOC_STRUCT(lkt_message); res->ref_count = 1; *(res->data) = 0; res->data_len = 0; -- GitLab