Description: Avoid SIGABRT if program_invocation_short_name is a pointer within progam_invocation_short_name Bug: https://github.com/elogind/elogind/issues/92 --- a/src/shared/musl_missing.c +++ b/src/shared/musl_missing.c @@ -34,9 +34,14 @@ static void elogind_free_program_name(void) { - if (program_invocation_name && (program_invocation_name != program_arg_name) && strlen(program_invocation_name)) + if (program_invocation_name && + (program_invocation_name != program_arg_name) && + strlen(program_invocation_name)) program_invocation_name = mfree(program_invocation_name); - if (program_invocation_short_name && (program_invocation_short_name != program_arg_name) && strlen(program_invocation_short_name)) + if (program_invocation_short_name && + (program_invocation_short_name != program_arg_name) && + (program_invocation_short_name + strlen(program_invocation_short_name) != program_invocation_name + strlen(program_invocation_name)) + && strlen(program_invocation_short_name)) program_invocation_short_name = mfree(program_invocation_short_name); } --- a/src/basic/process-util.c +++ b/src/basic/process-util.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -306,8 +307,12 @@ k = strlen(program_invocation_name); strncpy(program_invocation_name, name, k); - if (l > k) + if (l > k) { truncated = true; + program_invocation_short_name = NULL; + } + else + program_invocation_short_name = program_invocation_name + strlen(dirname(program_invocation_name)) -1; } /* Third step, completely replace the argv[] array the kernel maintains for us. This requires privileges, but