From 942f582329f4e0753d2e2fafd6e42b4304145055 Mon Sep 17 00:00:00 2001 From: Cory McWilliams Date: Fri, 7 Mar 2025 12:37:02 -0500 Subject: [PATCH] trace: Fix a crash and source of invalid json. --- src/trace.c | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/src/trace.c b/src/trace.c index 5a44dca9..d641c15e 100644 --- a/src/trace.c +++ b/src/trace.c @@ -4,6 +4,7 @@ #include "trace.h" +#include "log.h" #include "mem.h" #include "util.js.h" @@ -149,25 +150,37 @@ static int _tf_trace_escape_name(char* out, size_t out_size, const char* name) { case '"': case '\\': - out[p++] = '\\'; - if ((size_t)p + 1 < out_size) + if ((size_t)p + 2 < out_size) { + out[p++] = '\\'; out[p++] = *c; } + else + { + out[p++] = '$'; + } break; case '\t': - out[p++] = '\\'; - if ((size_t)p + 1 < out_size) + if ((size_t)p + 2 < out_size) { + out[p++] = '\\'; out[p++] = 't'; } + else + { + out[p++] = '$'; + } break; case '\n': - out[p++] = '\\'; - if ((size_t)p + 1 < out_size) + if ((size_t)p + 2 < out_size) { + out[p++] = '\\'; out[p++] = 'n'; } + else + { + out[p++] = '$'; + } break; default: out[p++] = *c; @@ -320,21 +333,22 @@ char* tf_trace_export(tf_trace_t* trace) } static const int k_extra_size = 1024; - char* buffer = tf_malloc(k_buffer_size + k_extra_size); + static const size_t k_out_buffer_size = k_buffer_size + k_extra_size; + char* buffer = tf_malloc(k_out_buffer_size); uv_mutex_lock(&trace->mutex); const char* newline = strchr(trace->buffer + trace->write_offset, '\n'); int begin = newline ? newline - trace->buffer : 0; size_t size = 0; - size += snprintf(buffer, k_buffer_size, "{\"displayTimeUnit\": \"ns\",\n\"traceEvents\": [\n"); + size += snprintf(buffer, k_out_buffer_size, "{\"displayTimeUnit\": \"ns\",\n\"traceEvents\": [\n"); if (*trace->process_name) { - size += snprintf(buffer + size, k_buffer_size - size, "{\"ph\":\"M\",\"pid\":%d,\"name\":\"process_name\",\"args\":{\"name\":\"%s\"}},\n", getpid(), trace->process_name); + size += snprintf(buffer + size, k_out_buffer_size - size, "{\"ph\":\"M\",\"pid\":%d,\"name\":\"process_name\",\"args\":{\"name\":\"%s\"}},\n", getpid(), trace->process_name); } uv_rwlock_rdlock(&trace->threads_lock); for (int i = 0; i < trace->threads_count; i++) { tf_trace_thread_t* thread = trace->threads[i]; - size += snprintf(buffer + size, k_buffer_size - size, "{\"ph\":\"M\",\"pid\":%d,\"tid\":%d,\"name\":\"thread_name\",\"args\":{\"name\":\"%s\"}},\n", getpid(), + size += snprintf(buffer + size, k_out_buffer_size - size, "{\"ph\":\"M\",\"pid\":%d,\"tid\":%d,\"name\":\"thread_name\",\"args\":{\"name\":\"%s\"}},\n", getpid(), thread->index, thread->name); } uv_rwlock_rdunlock(&trace->threads_lock); @@ -352,8 +366,8 @@ char* tf_trace_export(tf_trace_t* trace) buffer[size - 2] = '\n'; size--; } - size += snprintf(buffer + size, k_buffer_size - size, "]}\n"); - assert(size < (size_t)k_buffer_size + k_extra_size); + size += snprintf(buffer + size, k_out_buffer_size - size, "]}\n"); + assert(size < k_out_buffer_size); buffer[size] = '\0'; return buffer; }