From be44046850adf018e648752571247115638df75b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Fri, 4 Apr 2014 20:13:10 +0200 Subject: Fix potential memory leaks and other small improvements --- c_src/nif_helpers.c | 2 ++ c_src/sdl_clipboard.c | 6 +++++- c_src/sdl_renderer.c | 23 +++++++++++++---------- c_src/sdl_window.c | 40 +++++++++++++++++++++++++++++----------- 4 files changed, 49 insertions(+), 22 deletions(-) diff --git a/c_src/nif_helpers.c b/c_src/nif_helpers.c index 820fef8..f655497 100644 --- a/c_src/nif_helpers.c +++ b/c_src/nif_helpers.c @@ -152,6 +152,8 @@ void* nif_main_thread(void* obj) while (nif_thread_receive(st, &msg)) nif_thread_handle(env, st, msg); + enif_free_env(env); + return NULL; } diff --git a/c_src/sdl_clipboard.c b/c_src/sdl_clipboard.c index 14d1a3e..2ecc485 100644 --- a/c_src/sdl_clipboard.c +++ b/c_src/sdl_clipboard.c @@ -53,7 +53,11 @@ NIF_FUNCTION(set_clipboard_text) BADARG_IF(!enif_get_list_length(env, argv[0], &len)); text = (char*)enif_alloc(len + 1); - BADARG_IF(!enif_get_string(env, argv[0], text, len + 1, ERL_NIF_LATIN1)); + + if (!enif_get_string(env, argv[0], text, len + 1, ERL_NIF_LATIN1)) { + enif_free(text); + return enif_make_badarg(env); + } ret = SDL_SetClipboardText(text); diff --git a/c_src/sdl_renderer.c b/c_src/sdl_renderer.c index 7895f11..5fa9628 100644 --- a/c_src/sdl_renderer.c +++ b/c_src/sdl_renderer.c @@ -254,33 +254,36 @@ NIF_FUNCTION(render_copy) { void* renderer_res; void* texture_res; - SDL_Rect *srcPtr, *dstPtr; + SDL_Rect *srcPtr = NULL, *dstPtr = NULL; BADARG_IF(!enif_get_resource(env, argv[0], res_Renderer, &renderer_res)); BADARG_IF(!enif_get_resource(env, argv[1], res_Texture, &texture_res)); - if (enif_is_identical(argv[2], atom_undefined)) - srcPtr = NULL; - else { + if (!enif_is_identical(argv[2], atom_undefined)) { BADARG_IF(!enif_is_map(env, argv[2])); srcPtr = (SDL_Rect*)enif_alloc(sizeof(SDL_Rect)); if (!map_to_rect(env, argv[2], srcPtr)) - return enif_make_badarg(env); + goto render_copy_badarg; } - if (enif_is_identical(argv[3], atom_undefined)) - dstPtr = NULL; - else { - BADARG_IF(!enif_is_map(env, argv[3])); + if (!enif_is_identical(argv[3], atom_undefined)) { + if (!enif_is_map(env, argv[3])) + goto render_copy_badarg; dstPtr = (SDL_Rect*)enif_alloc(sizeof(SDL_Rect)); if (!map_to_rect(env, argv[3], dstPtr)) - return enif_make_badarg(env); + goto render_copy_badarg; } return nif_thread_call(env, thread_render_copy, 4, NIF_RES_GET(Renderer, renderer_res), NIF_RES_GET(Texture, texture_res), srcPtr, dstPtr); + +render_copy_badarg: + enif_free(srcPtr); + enif_free(dstPtr); + + return enif_make_badarg(env); } // render_copy_ex diff --git a/c_src/sdl_window.c b/c_src/sdl_window.c index c35fb0c..c644c09 100644 --- a/c_src/sdl_window.c +++ b/c_src/sdl_window.c @@ -75,12 +75,11 @@ NIF_CALL_HANDLER(thread_create_window) NIF_FUNCTION(create_window) { - char* title = (char*)enif_alloc(255); + unsigned int len; + char* title; int x, y, w, h; Uint32 flags = 0; - BADARG_IF(!enif_get_string(env, argv[0], title, 255, ERL_NIF_LATIN1)); - if (enif_is_atom(env, argv[1])) { BADARG_IF(!atom_to_window_pos(env, argv[1], &x)); } else { @@ -97,6 +96,16 @@ NIF_FUNCTION(create_window) BADARG_IF(!enif_get_int(env, argv[4], &h)); BADARG_IF(!list_to_window_flags(env, argv[5], &flags)); + // Getting the title last to simplify the code due to memory allocation. + + BADARG_IF(!enif_get_list_length(env, argv[0], &len)); + title = (char*)enif_alloc(len + 1); + + if (!enif_get_string(env, argv[0], title, len + 1, ERL_NIF_LATIN1)) { + enif_free(title); + return enif_make_badarg(env); + } + return nif_thread_call(env, thread_create_window, 6, title, x, y, w, h, flags); } @@ -465,17 +474,18 @@ NIF_CALL_HANDLER(thread_set_window_brightness) NIF_FUNCTION(set_window_brightness) { void* window_res; - double f; - double *fp; + double *brightnessPtr; BADARG_IF(!enif_get_resource(env, argv[0], res_Window, &window_res)); - BADARG_IF(!enif_get_double(env, argv[1], &f)); - fp = (double*)enif_alloc(sizeof(double)); - *fp = f; + brightnessPtr = (double*)enif_alloc(sizeof(double)); + if (!enif_get_double(env, argv[1], brightnessPtr)) { + enif_free(brightnessPtr); + return enif_make_badarg(env); + } return nif_thread_call(env, thread_set_window_brightness, 2, - NIF_RES_GET(Window, window_res), fp); + NIF_RES_GET(Window, window_res), brightnessPtr); } // set_window_fullscreen @@ -636,10 +646,18 @@ NIF_CAST_HANDLER(thread_set_window_title) NIF_FUNCTION(set_window_title) { void* window_res; - char* title = (char*)enif_alloc(255); + unsigned int len; + char* title; BADARG_IF(!enif_get_resource(env, argv[0], res_Window, &window_res)); - BADARG_IF(!enif_get_string(env, argv[1], title, 255, ERL_NIF_LATIN1)); + + BADARG_IF(!enif_get_list_length(env, argv[1], &len)); + title = (char*)enif_alloc(len + 1); + + if (!enif_get_string(env, argv[1], title, len + 1, ERL_NIF_LATIN1)) { + enif_free(title); + return enif_make_badarg(env); + } return nif_thread_cast(env, thread_set_window_title, 2, NIF_RES_GET(Window, window_res), title); -- cgit v1.2.3