diff options
author | Jiwoong Im <jiwoong.im@samsung.com> | 2016-12-06 13:55:41 +0900 |
---|---|---|
committer | Jiwoong Im <jiwoong.im@samsung.com> | 2016-12-07 07:59:51 +0900 |
commit | dda730c4fc6c06d8d5b93dac4ddd95ef133f71e8 (patch) | |
tree | d5affac496904aeaca0064d6fb0a1cb98b116791 | |
parent | f85d7393f5ac6ec7daa1fdddc2fd5d612e1fd820 (diff) | |
download | alarm-manager-dda730c4fc6c06d8d5b93dac4ddd95ef133f71e8.tar.gz alarm-manager-dda730c4fc6c06d8d5b93dac4ddd95ef133f71e8.tar.bz2 alarm-manager-dda730c4fc6c06d8d5b93dac4ddd95ef133f71e8.zip |
Fix memory leak in handling expired notification alarm
Change-Id: I54c5e9843ddfa0f376a611579b8567e50de906e6
Signed-off-by: Jiwoong Im <jiwoong.im@samsung.com>
-rw-r--r-- | alarm-manager.c | 69 |
1 files changed, 55 insertions, 14 deletions
diff --git a/alarm-manager.c b/alarm-manager.c index efa6356..7784353 100644 --- a/alarm-manager.c +++ b/alarm-manager.c @@ -1557,6 +1557,52 @@ static int __find_login_user(uid_t *uid) return -1; } +static int __post_notification(guchar *data, int datalen, uid_t uid) +{ + int ret; + GVariant *noti_gv = NULL; + GVariant *body = NULL; + notification_h noti; + + noti_gv = g_variant_new_from_data(G_VARIANT_TYPE("(v)"), + data, datalen, TRUE, NULL, NULL); + + if (noti_gv == NULL) + return -1; + + g_variant_get(noti_gv, "(v)", &body); + + if (body == NULL) { + g_variant_unref(noti_gv); + return -1; + } + + noti = notification_create(NOTIFICATION_TYPE_NOTI); + if (noti == NULL) { + g_variant_unref(body); + g_variant_unref(noti_gv); + return -1; + } + + ret = notification_ipc_make_noti_from_gvariant(noti, body); + + if (ret != NOTIFICATION_ERROR_NONE) { + g_variant_unref(body); + g_variant_unref(noti_gv); + notification_free(noti); + return -1; + } + + device_display_change_state(DISPLAY_STATE_NORMAL); + ret = notification_post_for_uid(noti, uid); + + g_variant_unref(body); + g_variant_unref(noti_gv); + notification_free(noti); + + return ret; +} + static void __alarm_expired() { int ret; @@ -1664,24 +1710,19 @@ static void __alarm_expired() bundle_free(b); } } else if (strncmp(g_quark_to_string(__alarm_info->quark_noti), "null", 4) != 0) { - GVariant *noti_gv = NULL; - GVariant *body = NULL; - guchar *data; - notification_h noti; + guchar *noti_data; int datalen; + ret = -1; - data = g_base64_decode(g_quark_to_string(__alarm_info->quark_noti), + noti_data = g_base64_decode(g_quark_to_string(__alarm_info->quark_noti), (gsize *)&datalen); + if (noti_data) { + ret = __post_notification(noti_data, datalen, __alarm_info->uid); + free(noti_data); + } - noti_gv = g_variant_new_from_data(G_VARIANT_TYPE("(v)"), - data, datalen, - TRUE, NULL, NULL); - - g_variant_get(noti_gv, "(v)", &body); - - noti = notification_create(NOTIFICATION_TYPE_NOTI); - notification_ipc_make_noti_from_gvariant(noti, body); - notification_post_for_uid(noti, __alarm_info->uid); + if (ret < 0) + ALARM_MGR_EXCEPTION_PRINT("Failed to post notification\n"); } else { char appid[MAX_SERVICE_NAME_LEN] = { 0, }; pkgmgrinfo_appinfo_h appinfo_handle = NULL; |