Fix some memory leaks 39/154039/4
authorKonrad Kuchciak <k.kuchciak@samsung.com>
Thu, 5 Oct 2017 11:24:38 +0000 (13:24 +0200)
committerKonrad Kuchciak <k.kuchciak@samsung.com>
Thu, 12 Oct 2017 10:32:10 +0000 (12:32 +0200)
This commit mainly fixes proper refing/unrefing faultd events, due to
ABI change in event_processor_report_event().

Few other leak fixes and regularities are also included.

Change-Id: I9eeebf8d943cb25414b2e08f999709894c50a9ff
Signed-off-by: Konrad Kuchciak <k.kuchciak@samsung.com>
src/database/ejdb.c
src/decision_makers/rv_dm.c
src/decision_makers/standard_fault_dm.c
src/decision_makers/vip_fault_dm.c
src/listeners/audit.c
src/listeners/startup.c
src/listeners/systemd.c

index cdff9ac357bb795b86030b3886226403501939d3..13652526a740327daf1fb5f3e010caa0678e1627 100644 (file)
@@ -130,6 +130,7 @@ static int faultd_object_to_bson(struct faultd_object *obj, bson *out)
 
                                faultd_object_to_bson(child, &b);
                                bson_append_bson(out, child->key, &b);
+                               bson_destroy(&b);
                                break;
                        }
                }
@@ -292,12 +293,15 @@ static int ejdb_get_by_oid(struct faultd_database_adapter *adapter, faultd_oid_t
        struct ejdb_adapter *da = to_ejdb_adapter(adapter);
        EJCOLL *coll = da->coll;
        bson *b;
+       int ret;
 
        b = ejdbloadbson(coll, &oid->bson);
        if (b == NULL)
                return -ENOENT;
 
-       return bson_to_faultd_object(b, result);
+       ret = bson_to_faultd_object(b, result);
+       bson_del(b);
+       return ret;
 }
 
 static int ejdb_load(struct faultd_database_adapter *adapter, struct faultd_object *query, struct faultd_object *result, uint32_t *nr)
@@ -317,7 +321,7 @@ static int ejdb_load(struct faultd_database_adapter *adapter, struct faultd_obje
 
        ret = faultd_object_to_bson(query, &bq);
        if (ret < 0)
-               goto finish;
+               return ret;
 
        q = ejdbcreatequery(db, &bq, NULL, 0, NULL);
        if (q == NULL) {
@@ -357,6 +361,8 @@ static int ejdb_load(struct faultd_database_adapter *adapter, struct faultd_obje
 
        ret = 0;
 finish:
+       bson_destroy(&bq);
+
        if (r != NULL)
                tclistdel(r);
 
index 2d1d33ec02144c6a8a787f93bc78586b7dd06ed9..5fe6a6aabc8f2ccfee2ca57bcb9bca4611b4153b 100644 (file)
@@ -63,29 +63,23 @@ static int rv_make_decision(struct faultd_event_handler *handler)
 
        if (ret) {
                log_error("Unable to create action data");
-               goto del_action_data;
+               goto cleanup;
        }
 
        ret = faultd_event_create(DECISION_MADE_EVENT_ID, &ev_data, &new_ev);
        if (ret) {
                log_error("Unable to create event");
-               goto del_action_data;
+               goto cleanup;
        }
 
-       faultd_event_unref(ev);
-
        ret = event_processor_report_event(new_ev);
+       faultd_event_unref(new_ev);
        if (ret) {
                log_error("Unable to report event");
-               goto unref_new_event;
+               goto cleanup;
        }
 
-       faultd_object_unref(ev_data.action_data);
-       return 0;
-
-unref_new_event:
-       faultd_event_unref(new_ev);
-del_action_data:
+cleanup:
        faultd_object_unref(ev_data.action_data);
        faultd_event_unref(ev);
        return 0;
index 8901e92a669c362862c621e334d04f51f7dda44f..1678467549e3518ea09863984b15f97139577694 100644 (file)
@@ -54,13 +54,16 @@ static int sf_make_decision(struct faultd_event_handler *handler)
        uint32_t nr;
 
        boot_event = get_boot_event();
-       if (!boot_event)
-               return -ENOTSUP;
+       if (!boot_event) {
+               log_error("Unable to get boot event");
+               goto unref_ev;
+       }
 
        ret = faultd_object_new(&query);
        if (ret < 0) {
+               log_error("Unable to create faultd object");
                faultd_event_unref(&boot_event->event);
-               return ret;
+               goto unref_ev;
        }
 
        faultd_object_append_oid(query, EV_BOOT_EVENT, &boot_event->event.oid);
@@ -69,8 +72,9 @@ static int sf_make_decision(struct faultd_event_handler *handler)
 
        ret = faultd_object_new(&service_obj);
        if (ret < 0) {
+               log_error("Unable to create faultd object");
                faultd_object_unref(query);
-               return ret;
+               goto unref_ev;
        }
 
        faultd_object_append_string(service_obj, SYSD_SERVICE_DBUS_PATH, sf_ev->service.dbus_path);
@@ -79,14 +83,18 @@ static int sf_make_decision(struct faultd_event_handler *handler)
 
        ret = database_load(query, NULL, &nr);
        faultd_object_unref(query);
-       if (ret < 0)
-               return ret;
+       if (ret < 0) {
+               log_error("Unable to load database");
+               goto unref_ev;
+       }
 
        log_debug("service failed %d times during current boot", nr);
 
        ret = faultd_object_new(&ev_data.action_data);
-       if (ret < 0)
-               return ret;
+       if (ret < 0) {
+               log_error("Unable to create faultd object");
+               goto unref_ev;
+       }
 
        if (nr < 3) {
                ev_data.action = FAULTD_ACTION_SERVICE_RECOVER_ID;
@@ -100,32 +108,25 @@ static int sf_make_decision(struct faultd_event_handler *handler)
 
        if (ret) {
                log_error("Unable to create action data");
-               goto del_action_data;
+               goto unref_action_data;
        }
 
        ret = faultd_event_create(DECISION_MADE_EVENT_ID, &ev_data, &new_ev);
        if (ret) {
                log_error("Unable to create event");
-               goto del_action_data;
+               goto unref_action_data;
        }
 
-       faultd_event_unref(ev);
-
        ret = event_processor_report_event(new_ev);
+       faultd_event_unref(new_ev);
        if (ret) {
                log_error("Unable to report event");
-               goto unref_new_event;
+               goto unref_action_data;
        }
 
+unref_action_data:
        faultd_object_unref(ev_data.action_data);
-       return 0;
-
-unref_new_event:
-       faultd_event_unref(new_ev);
-       return 0;
-
-del_action_data:
-       faultd_object_unref(ev_data.action_data);
+unref_ev:
        faultd_event_unref(ev);
        return 0;
 }
index d2e067ced098397f6bd94ef05cc1a43cf8ba065d..1ed8a80b48422f73f4d0b034fd7b2eb47493c40b 100644 (file)
@@ -48,39 +48,35 @@ static int vf_make_decision(struct faultd_event_handler *handler)
        int ret;
 
        ret = faultd_object_new(&ev_data.action_data);
-       if (ret < 0)
-               return ret;
+       if (ret < 0) {
+               log_error("Unable to create faultd object");
+               goto unref_ev;
+       }
 
        ret = faultd_fill_for_reboot(ev_data.action_data);
-       if (ret)
-               goto del_action_data;
+       if (ret) {
+               log_error("Unable to create action data");
+               faultd_object_unref(ev_data.action_data);
+               goto unref_ev;
+       }
 
        ret = faultd_event_create(DECISION_MADE_EVENT_ID, &ev_data, &new_ev);
+       faultd_object_unref(ev_data.action_data);
        if (ret) {
                log_error("Unable to create event");
-               goto del_action_data;
+               goto unref_ev;
        }
 
-       faultd_event_unref(ev);
-
        ret = event_processor_report_event(new_ev);
+       faultd_event_unref(new_ev);
        if (ret) {
                log_error("Unable to report event");
-               goto unref_new_event;
+               goto unref_ev;
        }
 
-       faultd_object_unref(ev_data.action_data);
-       return 0;
-
-unref_new_event:
-       faultd_event_unref(new_ev);
-       return 0;
-
-del_action_data:
-       faultd_object_unref(ev_data.action_data);
+unref_ev:
        faultd_event_unref(ev);
        return 0;
-
 }
 
 static struct faultd_event_handler vip_fault_event_handler = {
index 93cc54c997f33c43669423aa7ee5cd5a10e94d7e..248f8a486f0518cbd5bf9ad1b63d85e764db0469 100644 (file)
@@ -139,20 +139,16 @@ static int audit_handler(sd_event_source *s, int fd, uint32_t revents, void *use
        }
 
        ret = event_processor_report_event(ev);
+       faultd_event_unref(ev);
        if (ret) {
                log_error("Unable to report event");
-               goto put_event;
+               return ret;
        }
 
        return 0;
 
-put_event:
-       faultd_event_unref(ev);
-       return ret;
-
 cleanup_service:
        systemd_service_cleanup(&rv_ev_data.service);
-
        return ret;
 }
 
index 7f370f4bbf404f3bc1ffbcd1bb17ed36e9af8db0..77bcb1b1bb5d9ee5a34e89f6b85389a4d8a513d7 100644 (file)
@@ -114,14 +114,11 @@ static int generate_event(const char *type, void *data, struct faultd_event **ev
                return ret;
        }
 
-       faultd_event_ref(*ev);
-
        ret = event_processor_report_event(*ev);
-       if (ret) {
+       if (ret)
                log_error_errno(ret, "Unable to report event");
-               faultd_event_unref(*ev);
-               faultd_event_unref(*ev);
-       }
+
+       /* we are not unrefing the event here, because it is still needed in parent function */
 
        return ret;
 }
@@ -134,11 +131,11 @@ static int startup_listener_init(struct faultd_module *module,
        struct sb_event_data sb_ev_data;
        sd_id128_t boot_id, last_boot_id;
        faultd_oid_t last_boot_event_oid;
-       int ret;
+       int ret = 0;
 
        ret = sd_id128_get_boot(&boot_id);
        if (ret)
-               goto error;
+               return ret;
 
        ret = retrieve_last_boot_event(&last_boot_event_oid);
        switch (ret) {
@@ -152,7 +149,7 @@ static int startup_listener_init(struct faultd_module *module,
        case 0:
                ret = retrieve_boot_id(&last_boot_event_oid, &last_boot_id);
                if (ret)
-                       goto error;
+                       return ret;
 
                if (!sd_id128_equal(boot_id, last_boot_id)) {
                        /* first start in current boot */
@@ -165,7 +162,7 @@ static int startup_listener_init(struct faultd_module *module,
                        ret = database_get_event(&last_boot_event_oid, &booted_ev);
                        if (ret) {
                                log_error_errno(ret, "Unable to create system booted event from database");
-                               goto error;
+                               return ret;
                        }
 
                        booted_ev->oid = last_boot_event_oid;
@@ -174,18 +171,19 @@ static int startup_listener_init(struct faultd_module *module,
                break;
 
        default:
-               goto error;
+               return ret;
                break;
        }
 
        ret = generate_event(SYSTEM_BOOTED_EVENT_ID, &sb_ev_data, &booted_ev);
        if (ret)
-               goto error;
+               return ret;
 
        ret = store_boot_event(&booted_ev->oid);
        if (ret) {
                log_error_errno(ret, "Could not store object in database");
-               goto booted_ev_unref;
+               faultd_event_unref(booted_ev);
+               return ret;
        }
 
 finish:
@@ -194,16 +192,10 @@ finish:
 
        ret = generate_event(FAULTD_STARTED_EVENT_ID, NULL, &started_ev);
        if (ret)
-               goto booted_ev_unref;
+               return ret;
 
        faultd_event_unref(started_ev);
-       return ret;
-
-booted_ev_unref:
-       faultd_event_unref(booted_ev);
-
-error:
-       return ret;
+       return 0;
 }
 
 static void startup_listener_cleanup(struct faultd_module *module)
index e3555e5ed1d1d23dc5cfc70c92cef2e5a4307d04..1023f49faa5541132c2e4b8d9966e1fcf82d3960 100644 (file)
@@ -177,10 +177,9 @@ static int on_unit_properties_changed(sd_bus_message *m, void *userdata,
                }
 
                rc = event_processor_report_event(ev);
-               if (rc) {
+               faultd_event_unref(ev);
+               if (rc)
                        log_error_errno(rc, "Unable to report event: %m");
-                       faultd_event_unref(ev);
-               }
        }
 finish:
        return rc;