From 60d51de0fde1942b4143bcaf8592fea368952864 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Sat, 24 Oct 2015 04:57:44 -0400 Subject: [PATCH] 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 --- lttng-context-callstack.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) 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) -- 2.34.1