Fix writer: leak of the header fields
authorJulien Desfossez <jdesfossez@efficios.com>
Wed, 18 Jan 2017 18:35:44 +0000 (13:35 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Sun, 28 May 2017 16:57:39 +0000 (12:57 -0400)
Signed-off-by: Julien Desfossez <jdesfossez@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
plugins/writer/write.c

index 91fcdf1fdf320f151cb27b04dfb24a6fa23189a4..84fe77d4aea526dd0b2c27156908588ccc39d0e2 100644 (file)
@@ -990,51 +990,87 @@ struct bt_ctf_event *copy_event(FILE *err, struct bt_ctf_event *event,
                struct bt_ctf_event_class *writer_event_class)
 {
        struct bt_ctf_event *writer_event;
-       struct bt_ctf_field *field;
+       struct bt_ctf_field *field, *copy_field;
        int ret;
 
        writer_event = bt_ctf_event_create(writer_event_class);
        if (!writer_event) {
-               fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__, __LINE__);
+               fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
+                               __LINE__);
                goto end;
        }
 
        field = bt_ctf_event_get_header(event);
-       ret = bt_ctf_event_set_header(writer_event,
-                       bt_ctf_field_copy(field));
-       if (ret < 0) {
+       if (!field) {
                BT_PUT(writer_event);
-               fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__, __LINE__);
+               fprintf(err, "[error] %s in %s:%d\n", __func__,
+                               __FILE__, __LINE__);
                goto end;
        }
+       copy_field = bt_ctf_field_copy(field);
+       bt_put(field);
+       if (copy_field) {
+               ret = bt_ctf_event_set_header(writer_event, copy_field);
+               if (ret < 0) {
+                       fprintf(err, "[error] %s in %s:%d\n", __func__,
+                                       __FILE__, __LINE__);
+                       goto error;
+               }
+               bt_put(copy_field);
+       }
 
+       /* Optional field, so it can fail silently. */
        field = bt_ctf_event_get_stream_event_context(event);
-       ret = bt_ctf_event_set_stream_event_context(writer_event,
-                       bt_ctf_field_copy(field));
-       if (ret < 0) {
-               BT_PUT(writer_event);
-               fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__, __LINE__);
-               goto end;
+       copy_field = bt_ctf_field_copy(field);
+       bt_put(field);
+       if (copy_field) {
+               ret = bt_ctf_event_set_stream_event_context(writer_event,
+                               copy_field);
+               if (ret < 0) {
+                       fprintf(err, "[error] %s in %s:%d\n", __func__,
+                                       __FILE__, __LINE__);
+                       goto error;
+               }
+               bt_put(copy_field);
        }
 
+       /* Optional field, so it can fail silently. */
        field = bt_ctf_event_get_event_context(event);
-       ret = bt_ctf_event_set_event_context(writer_event,
-                       bt_ctf_field_copy(field));
-       if (ret < 0) {
-               BT_PUT(writer_event);
-               fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__, __LINE__);
-               goto end;
+       copy_field = bt_ctf_field_copy(field);
+       bt_put(field);
+       if (copy_field) {
+               ret = bt_ctf_event_set_event_context(writer_event, copy_field);
+               if (ret < 0) {
+                       fprintf(err, "[error] %s in %s:%d\n", __func__,
+                                       __FILE__, __LINE__);
+                       goto error;
+               }
+               bt_put(copy_field);
        }
 
        field = bt_ctf_event_get_payload_field(event);
-       ret = bt_ctf_event_set_payload_field(writer_event,
-                       bt_ctf_field_copy(field));
-       if (ret < 0) {
+       if (!field) {
                BT_PUT(writer_event);
-               fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__, __LINE__);
+               fprintf(err, "[error] %s in %s:%d\n", __func__,
+                               __FILE__, __LINE__);
                goto end;
        }
+       copy_field = bt_ctf_field_copy(field);
+       bt_put(field);
+       if (copy_field) {
+               ret = bt_ctf_event_set_payload_field(writer_event, copy_field);
+               if (ret < 0) {
+                       fprintf(err, "[error] %s in %s:%d\n", __func__,
+                                       __FILE__, __LINE__);
+                       goto error;
+               }
+               bt_put(copy_field);
+       }
+       goto end;
 
+error:
+       bt_put(copy_field);
+       BT_PUT(writer_event);
 end:
        return writer_event;
 }
This page took 0.026371 seconds and 4 git commands to generate.