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.
This commit is contained in:
Christian Hergert
2024-09-12 09:22:22 -07:00
parent c9a3ab1401
commit c228634fcb
2 changed files with 7 additions and 3 deletions

View File

@ -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;

View File

@ -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;