diff --git a/Libraries/LibC/unistd.cpp b/Libraries/LibC/unistd.cpp index fe07434a68ed46..db2434c7f49d4f 100644 --- a/Libraries/LibC/unistd.cpp +++ b/Libraries/LibC/unistd.cpp @@ -111,13 +111,10 @@ int execve(const char* filename, char* const argv[], char* const envp[]) int execvpe(const char* filename, char* const argv[], char* const envp[]) { + if (strchr(filename, '/')) + return execve(filename, argv, envp); + ScopedValueRollback errno_rollback(errno); - int rc = execve(filename, argv, envp); - if (rc < 0 && errno != ENOENT) { - errno_rollback.set_override_rollback_value(errno); - dbg() << "execvpe() failed on first with" << strerror(errno); - return rc; - } String path = getenv("PATH"); if (path.is_empty()) path = "/bin:/usr/bin"; diff --git a/Tests/LibC/exec-should-not-search-current-directory.cpp b/Tests/LibC/exec-should-not-search-current-directory.cpp new file mode 100644 index 00000000000000..57a023a6df45bd --- /dev/null +++ b/Tests/LibC/exec-should-not-search-current-directory.cpp @@ -0,0 +1,20 @@ +#include +#include +#include + +int main() +{ + int fd = open("hax", O_CREAT | O_RDWR, 0755); + ftruncate(fd, 0); + close(fd); + + int rc = execlp("hax", "hax", nullptr); + int saved_errno = errno; + unlink("hax"); + if (rc == -1 && saved_errno == ENOEXEC) { + printf("FAIL\n"); + return 1; + } + printf("PASS\n"); + return 0; +}