Fix memory leak in handling expired notification alarm
authorJiwoong Im <jiwoong.im@samsung.com>
Tue, 6 Dec 2016 04:55:41 +0000 (13:55 +0900)
committerJiwoong Im <jiwoong.im@samsung.com>
Tue, 6 Dec 2016 22:59:51 +0000 (07:59 +0900)
Change-Id: I54c5e9843ddfa0f376a611579b8567e50de906e6
Signed-off-by: Jiwoong Im <jiwoong.im@samsung.com>
alarm-manager.c

index efa6356..7784353 100644 (file)
@@ -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;