diff --git a/src/kcrash.cpp b/src/kcrash.cpp --- a/src/kcrash.cpp +++ b/src/kcrash.cpp @@ -757,55 +757,93 @@ return (pid > 0); //return true on success } +static int write_socket(int socket, long value) +{ + return write_socket(socket, (char*)&value, sizeof(value)); +} + +static int write_socket(int socket, const char* string) +{ + return write_socket(socket, (char*)string, strlen(string) + 1); +} + static pid_t startFromKdeinit(int argc, const char *argv[]) { int socket = openSocket(); if (socket < -1) { return 0; } kcrash_launcher_header header; header.cmd = LAUNCHER_EXEC_NEW; - const int BUFSIZE = 8192; // make sure this is big enough const int CWDSIZE = 2000; - char buffer[ BUFSIZE + 10 + 24 /*the env var*/ + CWDSIZE+1 ]; int pos = 0; long argcl = argc; - memcpy(buffer + pos, &argcl, sizeof(argcl)); pos += sizeof(argcl); for (int i = 0; i < argc; ++i) { int len = strlen(argv[ i ]) + 1; // include terminating \0 - if (pos + len >= BUFSIZE) { - fprintf(stderr, "BUFSIZE in KCrash not big enough!\n"); - return 0; - } - memcpy(buffer + pos, argv[ i ], len); pos += len; } - long env = 1; // 1 env var - memcpy(buffer + pos, &env, sizeof(env)); + long env = 0; pos += sizeof(env); static const char s_envVar[] = "KCRASH_AUTO_RESTARTED=1"; - int len = strlen(s_envVar) + 1; - memcpy(buffer + pos, s_envVar, len); - pos += len; + + bool our_envvar_seen = false; + long envbytes = 0; + for (; environ[env]; env++) { + if (strncmp(environ[env], s_envVar, strlen(s_envVar)-1) == 0) { + our_envvar_seen = true; + envbytes += strlen(s_envVar) + 1; + } else { + envbytes += strlen(environ[env]) + 1; + } + } + if (!our_envvar_seen) { + env++; + int len = strlen(s_envVar) + 1; + envbytes += len; + } + pos += envbytes; long avoid_loops = 0; - memcpy(buffer + pos, &avoid_loops, sizeof(avoid_loops)); pos += sizeof(avoid_loops); char cwd[CWDSIZE]; - if (getcwd(cwd, CWDSIZE-1)) { - len = strlen(cwd) + 1; // include terminating \0 - memcpy(buffer + pos, cwd, len); - pos += len; + bool cwd_ok; + if (cwd_ok = getcwd(cwd, CWDSIZE-1)) { + pos += strlen(cwd) + 1; // include terminating \0 } header.arg_length = pos; write_socket(socket, (char *) &header, sizeof(header)); - write_socket(socket, buffer, pos); + + write_socket(socket, argcl); + for (int i = 0; i