From c9d3ec0088c78670257823ae4b5a609473e7683e Mon Sep 17 00:00:00 2001 From: Bartosz Taudul Date: Sun, 30 Aug 2026 16:31:06 +0200 Subject: [PATCH] Harden external thread name lookups against dead threads. A thread exiting between fopen and read leaves the comm and status buffers under-filled or uninitialized: zero-initialize them, treat a short or empty read as unknown, and never scan the status when the read returned nothing. --- public/client/TracySysTrace.cpp | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/public/client/TracySysTrace.cpp b/public/client/TracySysTrace.cpp index 3e18adb8..a5db45b4 100644 --- a/public/client/TracySysTrace.cpp +++ b/public/client/TracySysTrace.cpp @@ -1565,10 +1565,17 @@ void SysTraceGetExternalName( uint64_t thread, const char*& threadName, const ch f = fopen( fn, "rb" ); if( f ) { - char buf[256]; + char buf[256] = {}; const auto sz = fread( buf, 1, 256, f ); if( sz > 0 && buf[sz-1] == '\n' ) buf[sz-1] = '\0'; - threadName = CopyString( buf ); + if( sz > 0 ) + { + threadName = CopyString( buf ); + } + else + { + threadName = CopyString( "???", 3 ); + } fclose( f ); } else @@ -1580,15 +1587,22 @@ void SysTraceGetExternalName( uint64_t thread, const char*& threadName, const ch f = fopen( fn, "rb" ); if( f ) { - char* tmp = (char*)tracy_malloc_fast( 8*1024 ); + char* tmp = (char*)tracy_malloc_fast( 8*1024 + 1 ); const auto fsz = (ptrdiff_t)fread( tmp, 1, 8*1024, f ); fclose( f ); + if( fsz <= 0 ) + { + tracy_free_fast( tmp ); + name = CopyStringFast( "???", 3 ); + return; + } + tmp[fsz] = '\0'; int pid = -1; auto line = tmp; for(;;) { - if( memcmp( "Tgid:\t", line, 6 ) == 0 ) + if( line - tmp + 6 <= fsz && memcmp( "Tgid:\t", line, 6 ) == 0 ) { pid = atoi( line + 6 ); break; @@ -1612,10 +1626,10 @@ void SysTraceGetExternalName( uint64_t thread, const char*& threadName, const ch f = fopen( fn, "rb" ); if( f ) { - char buf[256]; + char buf[256] = {}; const auto sz = fread( buf, 1, 256, f ); if( sz > 0 && buf[sz-1] == '\n' ) buf[sz-1] = '\0'; - name = CopyStringFast( buf ); + name = sz > 0 ? CopyStringFast( buf ) : CopyStringFast( "???", 3 ); fclose( f ); return; }