Fix: event copy constructor frees original event on error
[lttng-tools.git] / src / lib / lttng-ctl / event.c
index 9413b7052ee80817360853669e9ec05e36546e13..5785345cd1bdb703da157f428da38733aefc582f 100644 (file)
@@ -54,6 +54,38 @@ error:
        goto end;
 }
 
+struct lttng_event *lttng_event_copy(const struct lttng_event *event)
+{
+       struct lttng_event *new_event;
+       struct lttng_event_extended *new_event_extended;
+
+       new_event = zmalloc(sizeof(*event));
+       if (!new_event) {
+               PERROR("Error allocating event structure");
+               goto end;
+       }
+
+       /* Copy the content of the old event. */
+       memcpy(new_event, event, sizeof(*event));
+
+       /*
+        * We need to create a new extended since the previous pointer is now
+        * invalid.
+        */
+       new_event_extended = zmalloc(sizeof(*new_event_extended));
+       if (!new_event_extended) {
+               PERROR("Error allocating event extended structure");
+               goto error;
+       }
+
+       new_event->extended.ptr = new_event_extended;
+end:
+       return new_event;
+error:
+       free(new_event);
+       goto end;
+}
+
 void lttng_event_destroy(struct lttng_event *event)
 {
        struct lttng_event_extended *event_extended;
@@ -165,8 +197,8 @@ end:
        return ret;
 }
 
-struct lttng_userspace_probe_location *
-lttng_event_get_userspace_probe_location(struct lttng_event *event)
+const struct lttng_userspace_probe_location *
+lttng_event_get_userspace_probe_location(const struct lttng_event *event)
 {
        struct lttng_userspace_probe_location *probe_location = NULL;
        struct lttng_event_extended *event_extended;
This page took 0.023705 seconds and 4 git commands to generate.