mirror of
https://github.com/wolfpld/tracy.git
synced 2026-09-01 16:08:30 +00:00
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.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user