projects
/
lttng-modules.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix: callstack context memory corruption
[lttng-modules.git]
/
src
/
lttng-context-callstack.c
diff --git
a/src/lttng-context-callstack.c
b/src/lttng-context-callstack.c
index 7b9e651272e4c3e5271928b8f051f96552401ba8..6b75772e4bec21e6333d4ab72bda264715619120 100644
(file)
--- a/
src/lttng-context-callstack.c
+++ b/
src/lttng-context-callstack.c
@@
-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;
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;
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;
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;
fdata = field_data_create(mode);
if (!fdata) {
ret = -ENOMEM;
@@
-156,10
+161,10
@@
int __lttng_add_callstack_generic(struct lttng_ctx **ctx,
return 0;
error_create:
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;
}
return ret;
}
This page took
0.023896 seconds
and
4
git commands to generate.