diff options
author | seungha.son <seungha.son@samsung.com> | 2016-11-30 21:20:31 +0900 |
---|---|---|
committer | Son seungha <seungha.son@samsung.com> | 2016-12-01 20:30:54 -0800 |
commit | bc9b35d5513cbc858761a34d0bb830252799e7ba (patch) | |
tree | 46dbac28fd5718fb4caa26b80574b25238a83390 /src | |
parent | c830a6becb41b3d9d1586ca6c4997f04ae638685 (diff) | |
download | badge-bc9b35d5513cbc858761a34d0bb830252799e7ba.tar.gz badge-bc9b35d5513cbc858761a34d0bb830252799e7ba.tar.bz2 badge-bc9b35d5513cbc858761a34d0bb830252799e7ba.zip |
Fix memory leak
- The buffer pointed by the dynamically allocated structure is changed
without free the memory under certain conditions. No pointer to
buffer allocated by malloc.
Signed-off-by: seungha.son <seungha.son@samsung.com>
Change-Id: I436286b2a9b866c6244d6c0a91187cf26842cad0
Diffstat (limited to 'src')
-rwxr-xr-x | src/badge_internal.c | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/src/badge_internal.c b/src/badge_internal.c index d57946f..6adcb79 100755 --- a/src/badge_internal.c +++ b/src/badge_internal.c @@ -1082,6 +1082,21 @@ static gint _badge_data_compare(gconstpointer a, gconstpointer b) return 1; } +static struct _badge_cb_data *__malloc_badge_cb_data(badge_change_cb callback, void *data) +{ + struct _badge_cb_data *bd = NULL; + bd = (struct _badge_cb_data *)malloc(sizeof(struct _badge_cb_data)); + if (bd == NULL) { + ERR("failed malloc badge_cb_data"); + return NULL; + } + + bd->callback = callback; + bd->data = data; + + return bd; +} + int _badge_register_changed_cb(badge_change_cb callback, void *data, uid_t uid) { struct _badge_cb_data *bd = NULL; @@ -1095,16 +1110,13 @@ int _badge_register_changed_cb(badge_change_cb callback, void *data, uid_t uid) if (_badge_cb_hash == NULL) _badge_cb_hash = g_hash_table_new(g_direct_hash, g_direct_equal); - bd = (struct _badge_cb_data *)malloc(sizeof(struct _badge_cb_data)); - if (bd == NULL) - return BADGE_ERROR_OUT_OF_MEMORY; - - bd->callback = callback; - bd->data = data; - badge_cb_list = (GList *)g_hash_table_lookup(_badge_cb_hash, GUINT_TO_POINTER(uid)); if (badge_cb_list == NULL) { + bd = __malloc_badge_cb_data(callback, data); + if (!bd) + return BADGE_ERROR_OUT_OF_MEMORY; + badge_cb_list = g_list_append(badge_cb_list, bd); g_hash_table_insert(_badge_cb_hash, GUINT_TO_POINTER(uid), badge_cb_list); } else { @@ -1114,6 +1126,9 @@ int _badge_register_changed_cb(badge_change_cb callback, void *data, uid_t uid) bd = g_list_nth_data(badge_found_list, 0); bd->data = data; } else { + bd = __malloc_badge_cb_data(callback, data); + if (!bd) + return BADGE_ERROR_OUT_OF_MEMORY; badge_cb_list = g_list_append(badge_cb_list, bd); } } |