Author: zooey Date: 2011-01-02 20:12:19 +0100 (Sun, 02 Jan 2011) New Revision: 40071 Changeset: http://dev.haiku-os.org/changeset/40071 Ticket: http://dev.haiku-os.org/ticket/7056 Modified: haiku/trunk/headers/private/kernel/team.h haiku/trunk/headers/private/system/syscalls.h haiku/trunk/headers/private/system/user_runtime.h haiku/trunk/src/system/kernel/team.cpp haiku/trunk/src/system/libroot/libroot_init.c haiku/trunk/src/system/libroot/posix/unistd/exec.cpp Log: Closing #7056: * inherit umask of calling process to images loaded via exec...() Modified: haiku/trunk/headers/private/kernel/team.h =================================================================== --- haiku/trunk/headers/private/kernel/team.h 2011-01-02 16:04:15 UTC (rev 40070) +++ haiku/trunk/headers/private/kernel/team.h 2011-01-02 19:12:19 UTC (rev 40071) @@ -76,7 +76,7 @@ thread_id _user_wait_for_child(thread_id child, uint32 flags, int32 *_reason, status_t *_returnCode); status_t _user_exec(const char *path, const char* const* flatArgs, - size_t flatArgsSize, int32 argCount, int32 envCount); + size_t flatArgsSize, int32 argCount, int32 envCount, mode_t umask); thread_id _user_fork(void); team_id _user_get_current_team(void); pid_t _user_process_info(pid_t process, int32 which); Modified: haiku/trunk/headers/private/system/syscalls.h =================================================================== --- haiku/trunk/headers/private/system/syscalls.h 2011-01-02 16:04:15 UTC (rev 40070) +++ haiku/trunk/headers/private/system/syscalls.h 2011-01-02 19:12:19 UTC (rev 40071) @@ -137,7 +137,8 @@ extern thread_id _kern_wait_for_child(thread_id child, uint32 flags, int32 *_reason, status_t *_returnCode); extern status_t _kern_exec(const char *path, const char* const* flatArgs, - size_t flatArgsSize, int32 argCount, int32 envCount); + size_t flatArgsSize, int32 argCount, int32 envCount, + mode_t umask); extern thread_id _kern_fork(void); extern pid_t _kern_process_info(pid_t process, int32 which); extern pid_t _kern_setpgid(pid_t process, pid_t group); Modified: haiku/trunk/headers/private/system/user_runtime.h =================================================================== --- haiku/trunk/headers/private/system/user_runtime.h 2011-01-02 16:04:15 UTC (rev 40070) +++ haiku/trunk/headers/private/system/user_runtime.h 2011-01-02 19:12:19 UTC (rev 40071) @@ -28,6 +28,7 @@ int env_count; char **args; char **env; + mode_t umask; // (mode_t)-1 means not set }; #endif /* KERNEL_USER_RUNTIME_H_ */ Modified: haiku/trunk/src/system/kernel/team.cpp =================================================================== --- haiku/trunk/src/system/kernel/team.cpp 2011-01-02 16:04:15 UTC (rev 40070) +++ haiku/trunk/src/system/kernel/team.cpp 2011-01-02 19:12:19 UTC (rev 40071) @@ -72,6 +72,7 @@ size_t flat_args_size; uint32 arg_count; uint32 env_count; + mode_t umask; port_id error_port; uint32 error_token; }; @@ -975,8 +976,8 @@ static status_t create_team_arg(struct team_arg** _teamArg, const char* path, char** flatArgs, - size_t flatArgsSize, int32 argCount, int32 envCount, port_id port, - uint32 token) + size_t flatArgsSize, int32 argCount, int32 envCount, mode_t umask, + port_id port, uint32 token) { struct team_arg* teamArg = (struct team_arg*)malloc(sizeof(team_arg)); if (teamArg == NULL) @@ -994,6 +995,7 @@ teamArg->flat_args_size = flatArgsSize; teamArg->arg_count = argCount; teamArg->env_count = envCount; + teamArg->umask = umask; teamArg->error_port = port; teamArg->error_token = token; @@ -1091,6 +1093,7 @@ sizeof(port_id)) < B_OK || user_memcpy(&programArgs->error_token, &teamArgs->error_token, sizeof(uint32)) < B_OK + || user_memcpy(&programArgs->umask, &teamArgs->umask, sizeof(mode_t)) < B_OK || user_memcpy(userArgs, teamArgs->flat_args, teamArgs->flat_args_size) < B_OK) { // the team deletion process will clean this mess @@ -1219,7 +1222,7 @@ update_set_id_user_and_group(team, path); status = create_team_arg(&teamArgs, path, flatArgs, flatArgsSize, argCount, - envCount, errorPort, errorToken); + envCount, (mode_t)-1, errorPort, errorToken); if (status != B_OK) goto err1; @@ -1348,7 +1351,7 @@ */ static status_t exec_team(const char* path, char**& _flatArgs, size_t flatArgsSize, - int32 argCount, int32 envCount) + int32 argCount, int32 envCount, mode_t umask) { // NOTE: Since this function normally doesn't return, don't use automatic // variables that need destruction in the function scope. @@ -1402,7 +1405,7 @@ return status; status = create_team_arg(&teamArgs, path, flatArgs, flatArgsSize, argCount, - envCount, -1, 0); + envCount, umask, -1, 0); if (status != B_OK) return status; @@ -3288,7 +3291,7 @@ status_t _user_exec(const char* userPath, const char* const* userFlatArgs, - size_t flatArgsSize, int32 argCount, int32 envCount) + size_t flatArgsSize, int32 argCount, int32 envCount, mode_t umask) { // NOTE: Since this function normally doesn't return, don't use automatic // variables that need destruction in the function scope. @@ -3305,7 +3308,7 @@ if (error == B_OK) { error = exec_team(path, flatArgs, _ALIGN(flatArgsSize), argCount, - envCount); + envCount, umask); // this one only returns in case of error } Modified: haiku/trunk/src/system/libroot/libroot_init.c =================================================================== --- haiku/trunk/src/system/libroot/libroot_init.c 2011-01-02 16:04:15 UTC (rev 40070) +++ haiku/trunk/src/system/libroot/libroot_init.c 2011-01-02 19:12:19 UTC (rev 40071) @@ -52,6 +52,9 @@ __gRuntimeLoader->call_atexit_hooks_for_range = _call_atexit_hooks_for_range; + if (__gRuntimeLoader->program_args->umask != (mode_t)-1) + umask(__gRuntimeLoader->program_args->umask); + __init_time(); __init_heap(); __init_env(__gRuntimeLoader->program_args); Modified: haiku/trunk/src/system/libroot/posix/unistd/exec.cpp =================================================================== --- haiku/trunk/src/system/libroot/posix/unistd/exec.cpp 2011-01-02 16:04:15 UTC (rev 40070) +++ haiku/trunk/src/system/libroot/posix/unistd/exec.cpp 2011-01-02 19:12:19 UTC (rev 40071) @@ -14,6 +14,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <umask.h> #include <unistd.h> @@ -103,7 +104,8 @@ environment, envCount, &flatArgs, &flatArgsSize); if (status == B_OK) { - errno = _kern_exec(path, flatArgs, flatArgsSize, argCount, envCount); + errno = _kern_exec(path, flatArgs, flatArgsSize, argCount, envCount, + __gUmask); // if this call returns, something definitely went wrong free(flatArgs);