readlink(/proc/pid/exe) instead of using argv[0]
This commit is contained in:
@@ -37,6 +37,49 @@ static void safe_print(int fd, ...)
|
|||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char *itoa(unsigned n)
|
||||||
|
{
|
||||||
|
static char ret[32];
|
||||||
|
char *p = ret;
|
||||||
|
for( int div = 1000000000; div > 0; div /= 10 )
|
||||||
|
{
|
||||||
|
*p++ = (n / div) + '0';
|
||||||
|
n %= div;
|
||||||
|
}
|
||||||
|
*p = 0;
|
||||||
|
p = ret;
|
||||||
|
while( p[0] == '0' && p[1] )
|
||||||
|
++p;
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(LINUX)
|
||||||
|
static void GetExecutableName( char *buf, int bufsize )
|
||||||
|
{
|
||||||
|
/* readlink(/proc/pid/exe). This is more reliable than argv[0]. */
|
||||||
|
char proc_fn[1024] = "/proc/";
|
||||||
|
strcat( proc_fn, itoa( getpid() ) );
|
||||||
|
strcat( proc_fn, "/exe" );
|
||||||
|
|
||||||
|
int got = readlink( proc_fn, buf, bufsize-1 );
|
||||||
|
if( got == -1 )
|
||||||
|
{
|
||||||
|
safe_print( fileno(stderr), "Crash handler readlink ", proc_fn, " failed: ", strerror(errno), "\n", NULL );
|
||||||
|
|
||||||
|
strncpy( buf, g_pCrashHandlerArgv0, bufsize );
|
||||||
|
buf[bufsize-1] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
buf[got] = 0;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static void GetExecutableName( char *buf, int bufsize )
|
||||||
|
{
|
||||||
|
strncpy( buf, g_pCrashHandlerArgv0, bufsize );
|
||||||
|
buf[bufsize-1] = 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void NORETURN spawn_child_process( int from_parent )
|
static void NORETURN spawn_child_process( int from_parent )
|
||||||
{
|
{
|
||||||
@@ -51,10 +94,12 @@ static void NORETURN spawn_child_process( int from_parent )
|
|||||||
close(from_parent);
|
close(from_parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
execl( g_pCrashHandlerArgv0, g_pCrashHandlerArgv0, CHILD_MAGIC_PARAMETER, NULL);
|
char path[1024];
|
||||||
|
GetExecutableName( path, sizeof(path) );
|
||||||
|
execlp( path, path, CHILD_MAGIC_PARAMETER, NULL );
|
||||||
|
|
||||||
/* If we got here, the exec failed. */
|
/* If we got here, the exec failed. */
|
||||||
safe_print(fileno(stderr), "Crash handler execl(", g_pCrashHandlerArgv0, ") failed: ", strerror(errno), "\n", NULL);
|
safe_print(fileno(stderr), "Crash handler execl(", path, ") failed: ", strerror(errno), "\n", NULL);
|
||||||
_exit(1);
|
_exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -150,22 +195,6 @@ static void parent_process( int to_child, const CrashData *crash )
|
|||||||
* signal trampolines. The result is that it doesn't properly show the
|
* signal trampolines. The result is that it doesn't properly show the
|
||||||
* function that actually caused the signal--which is the most important
|
* function that actually caused the signal--which is the most important
|
||||||
* one! So, we have to do it all ourself. */
|
* one! So, we have to do it all ourself. */
|
||||||
static const char *itoa(unsigned n)
|
|
||||||
{
|
|
||||||
static char ret[32];
|
|
||||||
char *p = ret;
|
|
||||||
for( int div = 1000000000; div > 0; div /= 10 )
|
|
||||||
{
|
|
||||||
*p++ = (n / div) + '0';
|
|
||||||
n %= div;
|
|
||||||
}
|
|
||||||
*p = 0;
|
|
||||||
p = ret;
|
|
||||||
while( p[0] == '0' && p[1] )
|
|
||||||
++p;
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(DARWIN)
|
#if defined(DARWIN)
|
||||||
const char *ExceptionName( int signo )
|
const char *ExceptionName( int signo )
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user