fix memory leak 82/74682/2 accepted/tizen/common/20160616.151747 accepted/tizen/ivi/20160616.105031 accepted/tizen/mobile/20160616.104948 accepted/tizen/tv/20160616.104958 accepted/tizen/wearable/20160616.105018 submit/tizen/20160616.003540
authorJiwoong Im <jiwoong.im@samsung.com>
Wed, 15 Jun 2016 07:44:22 +0000 (16:44 +0900)
committerJiwoong Im <jiwoong.im@samsung.com>
Wed, 15 Jun 2016 08:16:51 +0000 (17:16 +0900)
Change-Id: I8e11dbe0b607debebf43169e12d2c5bfd8b2324f
Signed-off-by: Jiwoong Im <jiwoong.im@samsung.com>
alarm-manager.c
alarm-session-agent/agent.c

index d068393..39d71a9 100644 (file)
@@ -1155,30 +1155,50 @@ static gboolean __send_noti_to_session_bus(char *service_name,
        ret = connect(fd, (struct sockaddr *)&saddr, sizeof(saddr));
        if (ret < 0) {
                ALARM_MGR_EXCEPTION_PRINT("connect failed - (errno %d)", errno);
+               close(fd);
                return FALSE;
        }
 
        gv = g_variant_new("(is)", alarm_id, service_name);
+       if (!gv) {
+               close(fd);
+               return FALSE;
+       }
+
        len = g_variant_get_size(gv);
 
-       gv_data = malloc(len);
-       if (!gv_data)
+       gv_data = NULL;
+       if (len > 0)
+               gv_data = malloc(len);
+
+       if (!gv_data) {
+               g_variant_unref(gv);
+               close(fd);
                return FALSE;
+       }
 
        g_variant_store(gv, gv_data);
+       g_variant_unref(gv);
 
        data = malloc(len + 4);
+       if (!data) {
+               close(fd);
+               return FALSE;
+       }
 
        memcpy(data, &len, 4);
        memcpy(data + 4, gv_data, len);
+       free(gv_data);
 
        if (send(fd, data, len + 4, 0) == -1) {
                ALARM_MGR_EXCEPTION_PRINT("sendto() failed (errno %d)", errno);
+               free(data);
+               close(fd);
                return FALSE;
        }
 
+       free(data);
        close(fd);
-
        return TRUE;
 }
 
index 0a59824..39f93c0 100644 (file)
@@ -194,12 +194,19 @@ static gboolean _alarm_agent_main(gint fd, GIOCondition condition,
                        if (errno != EAGAIN && errno != EINTR)
                                LOGE("recv: fd %d errno %d", clifd, errno);
                }
+               close(clifd);
+               return G_SOURCE_CONTINUE;
+       }
+
+       if (len <= 0) {
+               close(clifd);
                return G_SOURCE_CONTINUE;
        }
 
        data = malloc(len);
        if (!data) {
                flush_data(clifd, len);
+               close(clifd);
                return G_SOURCE_CONTINUE;
        }
 
@@ -211,18 +218,26 @@ static gboolean _alarm_agent_main(gint fd, GIOCondition condition,
                        if (errno != EAGAIN && errno != EINTR)
                                LOGE("recv: fd %d errno %d", clifd, errno);
                }
-
                free(data);
+               close(clifd);
                return G_SOURCE_CONTINUE;
        }
 
        gv = g_variant_new_from_data(G_VARIANT_TYPE("(is)"),
                        data, len, TRUE, NULL, NULL);
-       assert(gv);
 
-       g_variant_get(gv, "(i&s)", &alarm_id, &service_name);
 
+       if (!gv) {
+               free(data);
+               close(clifd);
+               return G_SOURCE_CONTINUE;
+       }
+
+       g_variant_get(gv, "(i&s)", &alarm_id, &service_name);
        _send_noti(service_name, alarm_id);
+
+       free(data);
+       g_variant_unref(gv);
        close(clifd);
        return G_SOURCE_CONTINUE;
 }