From: Mathieu Desnoyers Date: Sat, 24 Oct 2015 08:57:44 +0000 (-0400) Subject: Fix callstack context: write empty sequence if no stack trace X-Git-Tag: v2.11.0-rc1~28 X-Git-Url: http://git.liburcu.org/?p=lttng-modules.git;a=commitdiff_plain;h=60d51de0fde1942b4143bcaf8592fea368952864 Fix callstack context: write empty sequence if no stack trace The trace content needs to match the metadata, else the trace will be corrupted. Signed-off-by: Mathieu Desnoyers --- diff --git a/lttng-context-callstack.c b/lttng-context-callstack.c index 3b7859eb..57738bed 100644 --- a/lttng-context-callstack.c +++ b/lttng-context-callstack.c @@ -156,8 +156,12 @@ size_t lttng_callstack_get_size(size_t offset, struct lttng_ctx_field *field, /* do not write data if no space is available */ trace = stack_trace_context(field, ctx); - if (!trace) - return 0; + if (unlikely(!trace)) { + size += lib_ring_buffer_align(offset, lttng_alignof(unsigned int)); + size += sizeof(unsigned int); + size += lib_ring_buffer_align(offset, lttng_alignof(unsigned long)); + return size; + } /* reset stack trace, no need to clear memory */ trace->nr_entries = 0; @@ -191,8 +195,13 @@ void lttng_callstack_record(struct lttng_ctx_field *field, struct stack_trace *trace = stack_trace_context(field, ctx); unsigned int nr_seq_entries; - if (!trace) + if (unlikely(!trace)) { + nr_seq_entries = 0; + lib_ring_buffer_align_ctx(ctx, lttng_alignof(unsigned int)); + chan->ops->event_write(ctx, &nr_seq_entries, sizeof(unsigned int)); + lib_ring_buffer_align_ctx(ctx, lttng_alignof(unsigned long)); return; + } lib_ring_buffer_align_ctx(ctx, lttng_alignof(unsigned int)); nr_seq_entries = trace->nr_entries; if (trace->nr_entries == trace->max_entries)