Fix: callstack: NULL pointer dereference: length field also need fdata
[lttng-modules.git] / src / lttng-context-callstack.c
index 7b9e651272e4c3e5271928b8f051f96552401ba8..b0f7a2fee5a1c7ed0234c57620bf67d965e9f890 100644 (file)
@@ -105,6 +105,7 @@ int __lttng_add_callstack_generic(struct lttng_ctx **ctx,
        const char *ctx_name = lttng_cs_ctx_mode_name(mode);
        const char *ctx_length_name = lttng_cs_ctx_mode_length_name(mode);
        struct lttng_ctx_field *length_field, *sequence_field;
+       ssize_t length_index, sequence_index;
        struct lttng_event_field *field;
        struct field_data *fdata;
        int ret;
@@ -112,18 +113,22 @@ int __lttng_add_callstack_generic(struct lttng_ctx **ctx,
        ret = init_type(mode);
        if (ret)
                return ret;
-       length_field = lttng_append_context(ctx);
-       if (!length_field)
-               return -ENOMEM;
-       sequence_field = lttng_append_context(ctx);
-       if (!sequence_field) {
-               lttng_remove_context_field(ctx, length_field);
-               return -ENOMEM;
+       if (lttng_find_context(*ctx, ctx_name))
+               return -EEXIST;
+       length_index = lttng_append_context_index(ctx);
+       if (length_index < 0) {
+               ret = -ENOMEM;
+               goto error_length;
        }
-       if (lttng_find_context(*ctx, ctx_name)) {
-               ret = -EEXIST;
-               goto error_find;
+       sequence_index = lttng_append_context_index(ctx);
+       if (sequence_index < 0) {
+               ret = -ENOMEM;
+               goto error_sequence;
        }
+       length_field = lttng_get_context_field_from_index(*ctx, length_index);
+       WARN_ON_ONCE(!length_field);
+       sequence_field = lttng_get_context_field_from_index(*ctx, sequence_index);
+       WARN_ON_ONCE(!sequence_field);
        fdata = field_data_create(mode);
        if (!fdata) {
                ret = -ENOMEM;
@@ -141,6 +146,7 @@ int __lttng_add_callstack_generic(struct lttng_ctx **ctx,
        field->type.u.integer.encoding = lttng_encode_none;
        length_field->get_size_arg = lttng_callstack_length_get_size;
        length_field->record = lttng_callstack_length_record;
+       length_field->priv = fdata;
 
        field = &sequence_field->event_field;
        field->name = ctx_name;
@@ -156,10 +162,10 @@ int __lttng_add_callstack_generic(struct lttng_ctx **ctx,
        return 0;
 
 error_create:
-       field_data_free(fdata);
-error_find:
-       lttng_remove_context_field(ctx, sequence_field);
-       lttng_remove_context_field(ctx, length_field);
+       lttng_remove_context_field_index(ctx, sequence_index);
+error_sequence:
+       lttng_remove_context_field_index(ctx, length_index);
+error_length:
        return ret;
 }
 
This page took 0.023658 seconds and 4 git commands to generate.