From c228634fcb38432bdd8af8691cef7e44c49c64cc Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Thu, 12 Sep 2024 09:22:22 -0700 Subject: [PATCH] libsysprof-capture: handle unwind length < 0 gracefully Also do the snapshot before setting up frame so that unwinders can do tricks to use extra space before the addr location. --- src/libsysprof-capture/sysprof-capture-writer.c | 7 ++++--- src/libsysprof-capture/sysprof-collector.c | 3 +++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/libsysprof-capture/sysprof-capture-writer.c b/src/libsysprof-capture/sysprof-capture-writer.c index aa2f9481..a309d585 100644 --- a/src/libsysprof-capture/sysprof-capture-writer.c +++ b/src/libsysprof-capture/sysprof-capture-writer.c @@ -1697,7 +1697,7 @@ sysprof_capture_writer_add_allocation (SysprofCaptureWriter *self, { SysprofCaptureAllocation *ev; size_t len; - unsigned int n_addrs; + int n_addrs; assert (self != NULL); assert (backtrace_func != NULL); @@ -1707,6 +1707,9 @@ sysprof_capture_writer_add_allocation (SysprofCaptureWriter *self, if (!ev) return false; + if ((n_addrs = backtrace_func (ev->addrs, MAX_UNWIND_DEPTH, backtrace_data)) < 0) + n_addrs = 0; + sysprof_capture_writer_frame_init (&ev->frame, len, cpu, @@ -1720,8 +1723,6 @@ sysprof_capture_writer_add_allocation (SysprofCaptureWriter *self, ev->tid = tid; ev->n_addrs = 0; - n_addrs = backtrace_func (ev->addrs, MAX_UNWIND_DEPTH, backtrace_data); - if (n_addrs <= MAX_UNWIND_DEPTH) ev->n_addrs = n_addrs; diff --git a/src/libsysprof-capture/sysprof-collector.c b/src/libsysprof-capture/sysprof-collector.c index eaf7e084..d7f0f120 100644 --- a/src/libsysprof-capture/sysprof-collector.c +++ b/src/libsysprof-capture/sysprof-collector.c @@ -525,6 +525,9 @@ sysprof_collector_allocate (SysprofCaptureAddress alloc_addr, else n_addrs = 0; + if (n_addrs < 0) + n_addrs = 0; + ev->n_addrs = ((n_addrs < 0) ? 0 : (n_addrs > MAX_UNWIND_DEPTH) ? MAX_UNWIND_DEPTH : n_addrs); ev->frame.len = sizeof *ev + sizeof (SysprofCaptureAddress) * ev->n_addrs; ev->frame.type = SYSPROF_CAPTURE_FRAME_ALLOCATION;