[haiku-commits] r40071 - in haiku/trunk: headers/private/kernel headers/private/system src/system/kernel src/system/libroot src/system/libroot/posix/unistd

  • From: zooey@xxxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sun, 2 Jan 2011 20:12:20 +0100 (CET)

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);


Other related posts:

  • » [haiku-commits] r40071 - in haiku/trunk: headers/private/kernel headers/private/system src/system/kernel src/system/libroot src/system/libroot/posix/unistd - zooey