diff --git a/dll/kernel32/internal.h b/dll/kernel32/internal.h index 2d4fd77..87139f1 100644 --- a/dll/kernel32/internal.h +++ b/dll/kernel32/internal.h @@ -55,7 +55,6 @@ struct ProcessObject final : WaitableObject { static constexpr ObjectType kType = ObjectType::Process; pid_t pid; - pid_t tid = 0; int pidfd; DWORD exitCode = STILL_ACTIVE; bool forcedExitCode = false; diff --git a/dll/kernel32/processthreadsapi.cpp b/dll/kernel32/processthreadsapi.cpp index bf74af7..207c54f 100644 --- a/dll/kernel32/processthreadsapi.cpp +++ b/dll/kernel32/processthreadsapi.cpp @@ -651,7 +651,7 @@ BOOL WIN_FUNC CreateProcessA(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSE if (lpProcessInformation) { lpProcessInformation->dwProcessId = static_cast(obj->pid); - lpProcessInformation->dwThreadId = static_cast(obj->tid); + lpProcessInformation->dwThreadId = static_cast(obj->pid); // Use the process ID as the thread ID lpProcessInformation->hProcess = wibo::handles().alloc(obj.clone(), 0 /* TODO: access */, 0); // Give hThread a process handle for now lpProcessInformation->hThread = wibo::handles().alloc(std::move(obj), 0 /* TODO: access */, 0); diff --git a/src/processes.cpp b/src/processes.cpp index a284eda..632c4b7 100644 --- a/src/processes.cpp +++ b/src/processes.cpp @@ -373,52 +373,19 @@ std::optional resolveExecutable(const std::string &comman return std::nullopt; } -static int spawnClone3(pid_t &pid, int &pidfd, int &tid, char **argv, char **envp) { - int exefd = open("/proc/self/exe", O_PATH | O_CLOEXEC); - if (exefd < 0) { - int err = errno; - perror("open /proc/self/exe"); - return err; - } - struct clone_args ca = {}; - ca.flags = CLONE_PIDFD | CLONE_PARENT_SETTID | CLONE_CLEAR_SIGHAND; - ca.pidfd = reinterpret_cast(&pidfd); - ca.parent_tid = reinterpret_cast(&tid); - pid = static_cast(syscall(SYS_clone3, &ca, sizeof(ca))); +static int spawnClone(pid_t &pid, int &pidfd, char **argv, char **envp) { + pid = static_cast(syscall(SYS_clone, CLONE_PIDFD, nullptr, &pidfd)); if (pid < 0) { int err = errno; - close(exefd); + perror("clone"); return err; } else if (pid == 0) { prctl(PR_SET_PDEATHSIG, SIGKILL); - // First, attempt to execveat using the open fd (atomic) - syscall(SYS_execveat, exefd, "", argv, envp, AT_EMPTY_PATH); - // Otherwise, fall back to direct execve execve("/proc/self/exe", argv, envp); // If we're still here, something went wrong perror("execve"); _exit(127); } - close(exefd); - return 0; -} - -static int spawnPosixSpawn(pid_t &pid, int &pidfd, char **argv, char **envp) { - std::error_code ec; - auto resolved = std::filesystem::read_symlink("/proc/self/exe", ec); - if (ec) { - return ec.value(); - } - int rc = posix_spawn(&pid, resolved.c_str(), nullptr, nullptr, argv, envp); - if (rc != 0) { - return rc; - } - pidfd = static_cast(syscall(SYS_pidfd_open, pid, 0)); - if (pidfd < 0) { - int err = errno; - perror("pidfd_open"); - return err; - } return 0; } @@ -460,22 +427,14 @@ static int spawnInternal(const std::vector &args, Pin(pid, pidfd); - obj->tid = tid; pinOut = obj.clone(); if (!processes().addProcess(std::move(obj))) { fprintf(stderr, "Failed to add process to process manager\n");