From 8560d1885b66dd1615ec4180fa3b496b8c73441c Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Thu, 20 Mar 2008 01:45:00 +0000 Subject: [PATCH] * The runtime_loader's test_executable() no longer analyzes the executable permissions of the file by hand. We use _kern_access() instead, which also handles the root case correctly. * The user and group arguments of test_executable() aren't needed any longer. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24483 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/kernel/user_runtime.h | 3 +-- src/system/libroot/os/image.c | 2 +- src/system/runtime_loader/runtime_loader.c | 17 ++--------------- .../runtime_loader/runtime_loader_private.h | 3 +-- 4 files changed, 5 insertions(+), 20 deletions(-) diff --git a/headers/private/kernel/user_runtime.h b/headers/private/kernel/user_runtime.h index e8a61b2fab..2107630b20 100644 --- a/headers/private/kernel/user_runtime.h +++ b/headers/private/kernel/user_runtime.h @@ -34,8 +34,7 @@ struct rld_export { int32 symbolType, void **_location); status_t (*get_nth_image_symbol)(image_id imageID, int32 num, char *symbolName, int32 *nameLength, int32 *symbolType, void **_location); - status_t (*test_executable)(const char *path, uid_t user, gid_t group, - char *starter); + status_t (*test_executable)(const char *path, char *interpreter); status_t (*get_next_image_dependency)(image_id id, uint32 *cookie, const char **_name); diff --git a/src/system/libroot/os/image.c b/src/system/libroot/os/image.c index a4bd5cb01e..123068252b 100644 --- a/src/system/libroot/os/image.c +++ b/src/system/libroot/os/image.c @@ -195,7 +195,7 @@ __get_next_image_dependency(image_id id, uint32 *cookie, const char **_name) status_t __test_executable(const char *path, char *invoker) { - return __gRuntimeLoader->test_executable(path, geteuid(), getegid(), invoker); + return __gRuntimeLoader->test_executable(path, invoker); } diff --git a/src/system/runtime_loader/runtime_loader.c b/src/system/runtime_loader/runtime_loader.c index 8b09979372..eab17243dd 100644 --- a/src/system/runtime_loader/runtime_loader.c +++ b/src/system/runtime_loader/runtime_loader.c @@ -267,12 +267,11 @@ open_executable(char *name, image_type type, const char *rpath, both types, the caller will give scripts a proper treatment. */ status_t -test_executable(const char *name, uid_t user, gid_t group, char *invoker) +test_executable(const char *name, char *invoker) { char path[B_PATH_NAME_LENGTH]; char buffer[B_FILE_NAME_LENGTH]; // must be large enough to hold the ELF header - struct stat stat; status_t status; ssize_t length; int fd; @@ -287,22 +286,10 @@ test_executable(const char *name, uid_t user, gid_t group, char *invoker) return fd; // see if it's executable at all - - status = _kern_read_stat(fd, NULL, true, &stat, sizeof(struct stat)); + status = _kern_access(path, X_OK); if (status != B_OK) goto out; - // shift mode bits, to check directly against accessMode - if (user == stat.st_uid) - stat.st_mode >>= 6; - else if (group == stat.st_gid) - stat.st_mode >>= 3; - - if (~(stat.st_mode & S_IRWXO) & X_OK) { - status = B_NOT_ALLOWED; - goto out; - } - // read and verify the ELF header length = _kern_read(fd, 0, buffer, sizeof(buffer)); diff --git a/src/system/runtime_loader/runtime_loader_private.h b/src/system/runtime_loader/runtime_loader_private.h index 1e2185a24e..84f3e5c569 100644 --- a/src/system/runtime_loader/runtime_loader_private.h +++ b/src/system/runtime_loader/runtime_loader_private.h @@ -25,8 +25,7 @@ extern "C" { int runtime_loader(void *arg); int open_executable(char *name, image_type type, const char *rpath, const char *programPath); -status_t test_executable(const char *path, uid_t user, gid_t group, - char *starter); +status_t test_executable(const char *path, char *interpreter); void terminate_program(void); image_id load_program(char const *path, void **entry);