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,24 @@ static pid_t startDirectly(const char *argv[]) { + static char autorestarted_envvar[] = "KCRASH_AUTO_RESTARTED"; + 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(environ, environ_end, environ_data.begin()); + + end = std::remove_if(environ_data.begin(), end, + [](const char* s) { + return strncmp(autorestarted_envvar, s, sizeof(autorestarted_envvar)-1) == 0 && + s[sizeof(autorestarted_envvar)-1] == '='; + }); + *end++ = "KCRASH_AUTO_RESTARTED=1"; + *end++ = nullptr; pid_t pid = fork(); switch (pid) { case -1: @@ -696,8 +717,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: