diff --git a/src/account.c b/src/account.c index 60b97ee..991b867 100644 --- a/src/account.c +++ b/src/account.c @@ -436,7 +436,7 @@ void content_account_blocked(PATH_ARGS) }; render_base_page(&b, req, ssn, api); - free(result); + Safefree(result); } void content_account_muted(PATH_ARGS) @@ -468,7 +468,7 @@ void content_account_muted(PATH_ARGS) }; render_base_page(&b, req, ssn, api); - free(result); + Safefree(result); } void content_account_favourites(PATH_ARGS) diff --git a/src/attachments.c b/src/attachments.c index a4d905d..3401d24 100644 --- a/src/attachments.c +++ b/src/attachments.c @@ -45,10 +45,10 @@ int try_upload_media(struct mstdnt_storage** storage, return 1; if (media_ids) - *media_ids = malloc(sizeof(char*) * size); + *media_ids = safemalloc(sizeof(char*) * size); - *attachments = malloc(sizeof(struct mstdnt_attachment) * size); - *storage = calloc(1, sizeof(struct mstdnt_storage) * size); + *attachments = safemalloc(sizeof(struct mstdnt_attachment) * size); + *storage = safecalloc(1, sizeof(struct mstdnt_storage) * size); for (int i = 0; i < size; ++i) { @@ -72,26 +72,26 @@ int try_upload_media(struct mstdnt_storage** storage, { for (size_t j = 0; j < i; ++j) { - if (media_ids) free((*media_ids)[j]); + if (media_ids) Safefree((*media_ids)[j]); mstdnt_storage_cleanup(*storage + j); } if (media_ids) { - free(*media_ids); + Safefree(*media_ids); *media_ids = NULL; } - free(*attachments); + Safefree(*attachments); *attachments = NULL; - free(*storage); + Safefree(*storage); *storage = NULL; return 1; } if (media_ids) { - (*media_ids)[i] = malloc(strlen((*attachments)[i].id)+1); + (*media_ids)[i] = safemalloc(strlen((*attachments)[i].id)+1); strcpy((*media_ids)[i], (*attachments)[i].id); } } @@ -104,7 +104,7 @@ void cleanup_media_storages(struct session* ssn, struct mstdnt_storage* storage) if (!FILES_READY(ssn)) return; for (size_t i = 0; i < keyfile(ssn->post.files).array_size; ++i) mstdnt_storage_cleanup(storage + i); - free(storage); + Safefree(storage); } void cleanup_media_ids(struct session* ssn, char** media_ids) @@ -112,8 +112,8 @@ void cleanup_media_ids(struct session* ssn, char** media_ids) if (!FILES_READY(ssn)) return; if (!media_ids) return; for (size_t i = 0; i < keyfile(ssn->post.files).array_size; ++i) - free(media_ids[i]); - free(media_ids); + Safefree(media_ids[i]); + Safefree(media_ids); } HV* perlify_attachment(const struct mstdnt_attachment* const attachment) @@ -153,7 +153,7 @@ void api_attachment_create(PATH_ARGS) { string = cJSON_Print(root); send_result(req, NULL, "application/json", string, 0); - free(string); + Safefree(string); } else send_result(req, NULL, "application/json", "{\"status\":\"Couldn't\"}", 0); @@ -161,6 +161,6 @@ void api_attachment_create(PATH_ARGS) // Cleanup media stuff cleanup_media_storages(ssn, att_storage); cleanup_media_ids(ssn, media_ids); - free(attachments); + Safefree(attachments); cJSON_Delete(root); } diff --git a/src/cookie.c b/src/cookie.c index 045faa7..638444f 100644 --- a/src/cookie.c +++ b/src/cookie.c @@ -36,7 +36,7 @@ char* read_cookies_env(REQUEST_T req, struct cookie_values* cookies) if (!cookies_env) return NULL; - char* cookies_str = malloc(strlen(cookies_env) + 1); + char* cookies_str = safemalloc(strlen(cookies_env) + 1); if (!cookies_str) { perror("malloc"); diff --git a/src/easprintf.c b/src/easprintf.c index 70395c3..92025ad 100644 --- a/src/easprintf.c +++ b/src/easprintf.c @@ -18,6 +18,7 @@ #include #include +#include "global_perl.h" #include "easprintf.h" int evasprintf(char** ret, const char* format, va_list ap) @@ -28,7 +29,7 @@ int evasprintf(char** ret, const char* format, va_list ap) int sz = vsnprintf(NULL, 0, format, ap); va_end(ap); - *ret = malloc(sz + 1); + *ret = safemalloc(sz + 1); if(*ret == NULL) { perror("malloc"); diff --git a/src/emoji.c b/src/emoji.c index 2cfe1b8..719e29d 100644 --- a/src/emoji.c +++ b/src/emoji.c @@ -72,7 +72,7 @@ void content_emoji_picker(PATH_ARGS) send_result(req, NULL, NULL, picker, 0); - free(picker); + Safefree(picker); } char* construct_emoji_picker(char* status_id, size_t* size) @@ -119,7 +119,7 @@ char* construct_emoji_picker(char* status_id, size_t* size) // Cleanup for (size_t i = 0; i < EMO_CAT_LEN; ++i) - free(emojis[i]); + Safefree(emojis[i]); return dup; } diff --git a/src/key.c b/src/key.c index 3a94cac..5b4f7b9 100644 --- a/src/key.c +++ b/src/key.c @@ -16,6 +16,7 @@ * along with this program. If not, see . */ +#include "global_perl.h" #include #include #include "key.h" @@ -46,13 +47,13 @@ void key_files(char* val, struct file_content* form, struct key* arg) struct file_array* arr = &(arg->type.f); char* content_cpy; - arr->content = realloc(arr->content, + arr->content = saferealloc(arr->content, sizeof(struct file_content) * ++(arr->array_size)); if (!(arr->content)) return; // Make a copy so we can remember it later - if (!(content_cpy = malloc(form->content_size+1))) + if (!(content_cpy = safemalloc(form->content_size+1))) return; memcpy(content_cpy, val, form->content_size+1); diff --git a/src/login.c b/src/login.c index ba29f15..21554c2 100644 --- a/src/login.c +++ b/src/login.c @@ -105,7 +105,7 @@ void content_login_oauth(PATH_ARGS) PRINTF("Set-Cookie: client_secret=%s; Path=/; Max-Age=3153600\r\n", app.client_secret); redirect(req, REDIRECT_303, url); - free(url); + Safefree(url); curl_free(encode_id); } } @@ -117,7 +117,7 @@ void content_login_oauth(PATH_ARGS) mstdnt_storage_cleanup(&storage); mstdnt_storage_cleanup(&oauth_storage); - if (urlify_redirect_url) free(urlify_redirect_url); + if (urlify_redirect_url) Safefree(urlify_redirect_url); if (decode_url) curl_free(decode_url); } @@ -192,7 +192,7 @@ void content_login(PATH_ARGS) PUT("Set-Cookie: instance_url=; Path=/; Max-Age=-1\r\n"); apply_access_token(req, token.access_token); - free(url_link); + Safefree(url_link); return; } } @@ -201,7 +201,7 @@ void content_login(PATH_ARGS) { // Restore and cleanup, an error occured m_args.url = orig_url; - free(url_link); + Safefree(url_link); } } diff --git a/src/main.c b/src/main.c index e40c8db..1103115 100644 --- a/src/main.c +++ b/src/main.c @@ -176,9 +176,9 @@ static void application(mstdnt_t* api, REQUEST_T req) handle_paths(req, &ssn, api, paths, sizeof(paths)/sizeof(paths[0])); // Cleanup - if (cookies_str) free(cookies_str); - if (post_str) free(post_str); - if (get_str) free(get_str); + if (cookies_str) Safefree(cookies_str); + if (post_str) Safefree(post_str); + if (get_str) Safefree(get_str); free_files(&(keyfile(ssn.post.files))); if (ssn.logged_in) mstdnt_cleanup_account(&(ssn.acct)); mstdnt_storage_cleanup(&(ssn.acct_storage)); @@ -251,6 +251,16 @@ int main(int argc, char **argv, char **env) init_template_files(aTHX); + // Setup mstdnt hooks + struct mstdnt_hooks hooks = { + .malloc = safemalloc, + // Not sure how this differs from Safefree? + .free = safefree, + .calloc = safecalloc, + .realloc = saferealloc, + }; + mstdnt_set_hooks(&hooks); + // Initiate mstdnt library mstdnt_t api; mstdnt_init(&api); diff --git a/src/mime.c b/src/mime.c index 854c621..d2d9c0c 100644 --- a/src/mime.c +++ b/src/mime.c @@ -17,6 +17,7 @@ */ #include +#include "global_perl.h" #include #include #include @@ -33,7 +34,7 @@ char* get_mime_boundary(char* content_type_str, char** bound) char* content = content_type_str; // Data gets changed in place - char* content_type = malloc(strlen(content)+1); + char* content_type = safemalloc(strlen(content)+1); if (!content_type) { perror("malloc"); @@ -66,7 +67,7 @@ char* get_mime_boundary(char* content_type_str, char** bound) return content_type; error: - free(content_type); + Safefree(content_type); return NULL; } diff --git a/src/path.c b/src/path.c index 642b47f..2a0a751 100644 --- a/src/path.c +++ b/src/path.c @@ -63,11 +63,11 @@ int parse_path(REQUEST_T req, read_len = (size_t)after_str - (size_t)(p2 + i); // Copy in new data from the string we just read - tmp = malloc(read_len+1); + tmp = safemalloc(read_len+1); strncpy(tmp, after_str - read_len, read_len); tmp[read_len] = '\0'; // Add our new string - data = realloc(data, ++size * sizeof(tmp)); + data = saferealloc(data, ++size * sizeof(tmp)); data[size-1] = tmp; // Move ahead (-1 because we move again) i += read_len - 1; @@ -95,9 +95,9 @@ breakpt: // Cleanup for (size_t i = 0; i < size; ++i) { - free(data[i]); + Safefree(data[i]); } - if (data) free(data); + if (data) Safefree(data); return res; } diff --git a/src/query.c b/src/query.c index 3763536..151440c 100644 --- a/src/query.c +++ b/src/query.c @@ -43,7 +43,7 @@ char* read_get_data(REQUEST_T req, struct get_values* query) if (query_string) { - get_query = malloc(strlen(query_string) + 1); + get_query = safemalloc(strlen(query_string) + 1); if (!get_query) { perror("malloc"); @@ -135,7 +135,7 @@ char* read_post_data(REQUEST_T req, struct post_values* post) char* mime_boundary; char* mime_mem = get_mime_boundary(GET_ENV("CONTENT_TYPE", req), &mime_boundary); int content_length = atoi(GET_ENV("CONTENT_LENGTH", req)); - post_query = malloc(content_length + 1); + post_query = safemalloc(content_length + 1); if (!post_query) { perror("malloc"); @@ -188,7 +188,7 @@ char* read_post_data(REQUEST_T req, struct post_values* post) } while (p_query_read); - if (mime_mem) free(mime_mem); + if (mime_mem) Safefree(mime_mem); } // Free me afterwards! @@ -226,7 +226,7 @@ char* try_handle_post(REQUEST_T req, void (*call)(struct http_query_info*, void* if (request_method && (strcmp("POST", request_method) == 0)) { int content_length = atoi(GET_ENV("CONTENT_LENGTH", req)); - post_query = malloc(content_length + 1); + post_query = safemalloc(content_length + 1); if (!post_query) { puts("Malloc error!"); @@ -265,9 +265,9 @@ void free_files(struct file_array* files) struct file_content* content = files->content; for (size_t i = 0; i < files->array_size; ++i) { - free(content[i].content); + Safefree(content[i].content); } - free(content); + Safefree(content); } // TODO use hvstores_XXX macros diff --git a/src/search.c b/src/search.c index bb140c6..ad7ac02 100644 --- a/src/search.c +++ b/src/search.c @@ -70,7 +70,7 @@ void content_search_all(PATH_ARGS) redirect(req, REDIRECT_303, url); break; } - free(url); + Safefree(url); curl_free(query); return; } diff --git a/src/status.c b/src/status.c index 77d03ee..61c713b 100644 --- a/src/status.c +++ b/src/status.c @@ -70,7 +70,7 @@ int try_post_status(struct session* ssn, mstdnt_t* api) json_ids_len = cJSON_GetArraySize(json_ids); if (json_ids_len) { - media_ids = malloc(json_ids_len * sizeof(char*)); + media_ids = safemalloc(json_ids_len * sizeof(char*)); // TODO error cJSON* id; int i = 0; @@ -110,11 +110,11 @@ int try_post_status(struct session* ssn, mstdnt_t* api) cleanup_media_storages(ssn, att_storage); if (json_ids) - free(media_ids); + Safefree(media_ids); else cleanup_media_ids(ssn, media_ids); - free(attachments); + Safefree(attachments); if (json_ids) cJSON_Delete(json_ids); return 0; } @@ -403,7 +403,7 @@ void content_status(PATH_ARGS, uint8_t flags) mstdnt_storage_cleanup(&storage); mstdnt_storage_cleanup(&status_storage); Safefree(dup); - free(picker); + Safefree(picker); } void notice_redirect(PATH_ARGS) @@ -411,7 +411,7 @@ void notice_redirect(PATH_ARGS) char* url; easprintf(&url, "%s/status/%s", config_url_prefix, data[0]); redirect(req, REDIRECT_303, url); - free(url); + Safefree(url); } HV* perlify_status_pleroma(const struct mstdnt_status_pleroma* pleroma) diff --git a/src/string.c b/src/string.c index 997bbe1..589fdcc 100644 --- a/src/string.c +++ b/src/string.c @@ -20,6 +20,7 @@ #define _DEFAULT_SOURCE #include #include +#include "global_perl.h" #include "easprintf.h" #include #include @@ -110,7 +111,7 @@ char* strrepl(char* source, char* find, char* repl, int flags) str_size += curr - last; // Create and copy - result = realloc(result, str_size + (!is_last ? repl_len : 0) + 1); + result = saferealloc(result, str_size + (!is_last ? repl_len : 0) + 1); strncpy(result + last_str_size, last, curr - last); if (!is_last) { @@ -134,9 +135,9 @@ char* sanitize_html(char* html) char* left = strrepl(amp, "<", "<", STRREPL_ALL); char* right = strrepl(left, ">", ">", STRREPL_ALL); char* quot = strrepl(right, "\"", """, STRREPL_ALL); - if (quot != right && right != html && right != left) free(right); - if (left != html && left != amp) free(left); - if (amp != html) free(amp); + if (quot != right && right != html && right != left) Safefree(right); + if (left != html && left != amp) Safefree(left); + if (amp != html) Safefree(amp); return quot; } diff --git a/src/string_helpers.c b/src/string_helpers.c index 0c57f7b..5ddf0cc 100644 --- a/src/string_helpers.c +++ b/src/string_helpers.c @@ -17,6 +17,7 @@ */ #include +#include "global_perl.h" #include #include #include "string_helpers.h" @@ -42,24 +43,24 @@ char* construct_func_strings(char* (*func)(void*, size_t, size_t*), if (parse_size == -1) /* Malloc error */ { - if (result) free(result); + if (result) Safefree(result); return NULL; } last_parse_size = curr_parse_size; curr_parse_size += parse_size; - result = realloc(result, curr_parse_size + 1); + result = saferealloc(result, curr_parse_size + 1); if (result == NULL) { perror("malloc"); - free(res_html); + Safefree(res_html); return NULL; } // Copy res_html to result in correct position strncpy(result + last_parse_size, res_html, parse_size); // Cleanup - free(res_html); + Safefree(res_html); } if (result) diff --git a/src/timeline.c b/src/timeline.c index a6feec0..db080c1 100644 --- a/src/timeline.c +++ b/src/timeline.c @@ -221,7 +221,7 @@ void tl_tag(REQUEST_T req, struct session* ssn, mstdnt_t* api, char* tag_id) easprintf(&header, "Hashtag - #%s", tag_id); content_timeline(req, ssn, api, &storage, statuses, statuses_len, BASE_CAT_NONE, header, 0, 0); - free(header); + Safefree(header); } void content_tl_home(PATH_ARGS)