diff --git a/src/kcrash.cpp b/src/kcrash.cpp --- a/src/kcrash.cpp +++ b/src/kcrash.cpp @@ -47,6 +47,9 @@ #include #include +#include +#include + #include #include #include @@ -683,6 +686,21 @@ static pid_t startDirectly(const char *argv[]) { + char** environ_end; + for(environ_end = environ; *environ_end; ++environ_end) {} + + std::array environ_data; //hope it's big enough + if((unsigned)(environ_end - environ) +2 >= environ_data.size()) { + fprintf(stderr, "environ_data in KCrash not big enough!\n"); + return 0; + } + auto end = std::copy_if(environ, environ_end, environ_data.begin(), + [](const char* s) { + static const char envvar[] = "KCRASH_AUTO_RESTARTED="; + return strncmp(envvar, s, sizeof(envvar)-1) != 0; + }); + *end++ = "KCRASH_AUTO_RESTARTED=1"; + *end++ = nullptr; pid_t pid = fork(); switch (pid) { case -1: @@ -696,8 +714,7 @@ #ifndef Q_OS_OSX closeAllFDs(); // We are in the child now. Close FDs unconditionally. #endif - setenv("KCRASH_AUTO_RESTARTED", "1", 1); - execvp(argv[0], const_cast< char ** >(argv)); + execvpe(argv[0], const_cast< char ** >(argv), const_cast (environ_data.data())); fprintf(stderr, "KCrash failed to exec(), errno = %d\n", errno); _exit(253); default: