summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiwoong Im <jiwoong.im@samsung.com>2016-12-06 13:55:41 +0900
committerJiwoong Im <jiwoong.im@samsung.com>2016-12-07 07:59:51 +0900
commitdda730c4fc6c06d8d5b93dac4ddd95ef133f71e8 (patch)
treed5affac496904aeaca0064d6fb0a1cb98b116791
parentf85d7393f5ac6ec7daa1fdddc2fd5d612e1fd820 (diff)
downloadalarm-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.c69
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;