Bug 18446: Keep umask for session bus
authorMatt McCutchen <matt@mattmccutchen.net>
Mon, 10 Nov 2008 13:55:27 +0000 (08:55 -0500)
committerColin Walters <walters@verbum.org>
Mon, 10 Nov 2008 13:55:27 +0000 (08:55 -0500)
Signed-off-by: Colin Walters <walters@verbum.org>
bus/bus.c
bus/config-parser-common.c
bus/config-parser-common.h
bus/config-parser.c
bus/config-parser.h
bus/dbus-daemon.1.in
bus/session.conf.in
dbus/dbus-sysdeps-util-unix.c
dbus/dbus-sysdeps-util-win.c
dbus/dbus-sysdeps.h
doc/busconfig.dtd

index d9fd2d9..e5733fe 100644 (file)
--- a/bus/bus.c
+++ b/bus/bus.c
@@ -54,6 +54,7 @@ struct BusContext
   BusMatchmaker *matchmaker;
   BusLimits limits;
   unsigned int fork : 1;
+  unsigned int keep_umask : 1;
 };
 
 static dbus_int32_t server_data_slot = -1;
@@ -384,6 +385,7 @@ process_config_first_time_only (BusContext      *context,
     }
 
   context->fork = bus_config_parser_get_fork (parser);
+  context->keep_umask = bus_config_parser_get_keep_umask (parser);
   
   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
   retval = TRUE;
@@ -708,7 +710,8 @@ bus_context_new (const DBusString *config_file,
         
         if (!_dbus_become_daemon (context->pidfile ? &u : NULL, 
                                   print_pid_pipe,
-                                  error))
+                                  error,
+                                  context->keep_umask))
           {
             _DBUS_ASSERT_ERROR_IS_SET (error);
             goto failed;
index 6e4bb70..1e0f7f9 100644 (file)
@@ -114,6 +114,10 @@ bus_config_parser_element_name_to_type (const char *name)
     {
       return ELEMENT_ASSOCIATE;
     }
+  else if (strcmp (name, "keep_umask") == 0)
+    {
+      return ELEMENT_KEEP_UMASK;
+    }
   return ELEMENT_NONE;
 }
 
@@ -162,6 +166,8 @@ bus_config_parser_element_type_to_name (ElementType type)
       return "selinux";
     case ELEMENT_ASSOCIATE:
       return "associate";
+    case ELEMENT_KEEP_UMASK:
+      return "keep_umask";
     }
 
   _dbus_assert_not_reached ("bad element type");
index 3718c95..01eb118 100644 (file)
@@ -47,7 +47,8 @@ typedef enum
   ELEMENT_SELINUX,
   ELEMENT_ASSOCIATE,
   ELEMENT_STANDARD_SESSION_SERVICEDIRS,
-  ELEMENT_STANDARD_SYSTEM_SERVICEDIRS
+  ELEMENT_STANDARD_SYSTEM_SERVICEDIRS,
+  ELEMENT_KEEP_UMASK
 } ElementType;
 
 ElementType bus_config_parser_element_name_to_type (const char *element_name);
index f9e0b7d..5bb34f1 100644 (file)
@@ -111,6 +111,8 @@ struct BusConfigParser
 
   unsigned int fork : 1; /**< TRUE to fork into daemon mode */
 
+  unsigned int keep_umask : 1; /**< TRUE to keep original umask when forking */
+
   unsigned int is_toplevel : 1; /**< FALSE if we are a sub-config-file inside another one */
 };
 
@@ -306,6 +308,9 @@ merge_included (BusConfigParser *parser,
   if (included->fork)
     parser->fork = TRUE;
 
+  if (included->keep_umask)
+    parser->keep_umask = TRUE;
+
   if (included->pidfile != NULL)
     {
       dbus_free (parser->pidfile);
@@ -698,6 +703,21 @@ start_busconfig_child (BusConfigParser   *parser,
       
       return TRUE;
     }
+  else if (element_type == ELEMENT_KEEP_UMASK)
+    {
+      if (!check_no_attributes (parser, "keep_umask", attribute_names, attribute_values, error))
+        return FALSE;
+
+      if (push_element (parser, ELEMENT_KEEP_UMASK) == NULL)
+        {
+          BUS_SET_OOM (error);
+          return FALSE;
+        }
+
+      parser->keep_umask = TRUE;
+      
+      return TRUE;
+    }
   else if (element_type == ELEMENT_PIDFILE)
     {
       if (!check_no_attributes (parser, "pidfile", attribute_names, attribute_values, error))
@@ -1947,6 +1967,7 @@ bus_config_parser_end_element (BusConfigParser   *parser,
     case ELEMENT_ALLOW:
     case ELEMENT_DENY:
     case ELEMENT_FORK:
+    case ELEMENT_KEEP_UMASK:
     case ELEMENT_SELINUX:
     case ELEMENT_ASSOCIATE:
     case ELEMENT_STANDARD_SESSION_SERVICEDIRS:
@@ -2232,6 +2253,7 @@ bus_config_parser_content (BusConfigParser   *parser,
     case ELEMENT_ALLOW:
     case ELEMENT_DENY:
     case ELEMENT_FORK:
+    case ELEMENT_KEEP_UMASK:
     case ELEMENT_STANDARD_SESSION_SERVICEDIRS:    
     case ELEMENT_STANDARD_SYSTEM_SERVICEDIRS:    
     case ELEMENT_SELINUX:
@@ -2554,6 +2576,12 @@ bus_config_parser_get_fork (BusConfigParser   *parser)
   return parser->fork;
 }
 
+dbus_bool_t
+bus_config_parser_get_keep_umask (BusConfigParser   *parser)
+{
+  return parser->keep_umask;
+}
+
 const char *
 bus_config_parser_get_pidfile (BusConfigParser   *parser)
 {
@@ -2947,6 +2975,9 @@ config_parsers_equal (const BusConfigParser *a,
   if (! bools_equal (a->fork, b->fork))
     return FALSE;
 
+  if (! bools_equal (a->keep_umask, b->keep_umask))
+    return FALSE;
+
   if (! bools_equal (a->is_toplevel, b->is_toplevel))
     return FALSE;
 
index ec0dfed..6d69f3d 100644 (file)
@@ -65,6 +65,7 @@ const char* bus_config_parser_get_type         (BusConfigParser *parser);
 DBusList**  bus_config_parser_get_addresses    (BusConfigParser *parser);
 DBusList**  bus_config_parser_get_mechanisms   (BusConfigParser *parser);
 dbus_bool_t bus_config_parser_get_fork         (BusConfigParser *parser);
+dbus_bool_t bus_config_parser_get_keep_umask   (BusConfigParser *parser);
 const char* bus_config_parser_get_pidfile      (BusConfigParser *parser);
 const char* bus_config_parser_get_servicehelper (BusConfigParser *parser);
 DBusList**  bus_config_parser_get_service_dirs (BusConfigParser *parser);
index 5599afe..7666f18 100644 (file)
@@ -214,6 +214,13 @@ into the background, etc.). This is generally used
 rather than the \-\-fork command line option.
 
 .TP
+.I "<keep_umask>"
+    
+.PP
+If present, the bus daemon keeps its original umask when forking.
+This may be useful to avoid affecting the behavior of child processes.
+
+.TP
 .I "<listen>"
 
 .PP
index b2dee5b..794eb8d 100644 (file)
@@ -8,6 +8,10 @@
   <!-- Our well-known bus type, don't change this -->
   <type>session</type>
 
+  <!-- If we fork, keep the user's original umask to avoid affecting
+       the behavior of child processes. -->
+  <keep_umask/>
+
   <listen>unix:tmpdir=@DBUS_SESSION_SOCKET_DIR@</listen>
 
   <standard_session_servicedirs />
index 0343a90..d8718c2 100644 (file)
  * @param pidfile #NULL, or pidfile to create
  * @param print_pid_pipe pipe to print daemon's pid to, or -1 for none
  * @param error return location for errors
+ * @param keep_umask #TRUE to keep the original umask
  * @returns #FALSE on failure
  */
 dbus_bool_t
 _dbus_become_daemon (const DBusString *pidfile,
                      DBusPipe         *print_pid_pipe,
-                     DBusError        *error)
+                     DBusError        *error,
+                     dbus_bool_t       keep_umask)
 {
   const char *s;
   pid_t child_pid;
@@ -121,9 +123,12 @@ _dbus_become_daemon (const DBusString *pidfile,
             _dbus_verbose ("keeping stderr open due to DBUS_DEBUG_OUTPUT\n");
         }
 
-      /* Get a predictable umask */
-      _dbus_verbose ("setting umask\n");
-      umask (022);
+      if (!keep_umask)
+        {
+          /* Get a predictable umask */
+          _dbus_verbose ("setting umask\n");
+          umask (022);
+        }
 
       _dbus_verbose ("calling setsid()\n");
       if (setsid () == -1)
index 8608ad0..6358531 100644 (file)
@@ -70,12 +70,14 @@ errno_t strcpy_s(char *dest, size_t size, char *src)
  * @param pidfile #NULL, or pidfile to create
  * @param print_pid_fd file descriptor to print daemon's pid to, or -1 for none
  * @param error return location for errors
+ * @param keep_umask #TRUE to keep the original umask
  * @returns #FALSE on failure
  */
 dbus_bool_t
 _dbus_become_daemon (const DBusString *pidfile,
                      DBusPipe         *print_pid_pipe,
-                     DBusError        *error)
+                     DBusError        *error,
+                     dbus_bool_t       keep_umask)
 {
   return TRUE;
 }
index 80236f0..469b5e5 100644 (file)
@@ -400,7 +400,8 @@ void        _dbus_print_backtrace  (void);
 
 dbus_bool_t _dbus_become_daemon   (const DBusString *pidfile,
                                    DBusPipe         *print_pid_pipe,
-                                   DBusError        *error);
+                                   DBusError        *error,
+                                   dbus_bool_t       keep_umask);
 
 dbus_bool_t _dbus_verify_daemon_user    (const char *user);
 dbus_bool_t _dbus_change_to_daemon_user (const char *user,
index 84593fe..0cc519b 100644 (file)
@@ -1,6 +1,7 @@
 <!ELEMENT busconfig (user |
                      type |
                      fork |
+                     keep_umask |
                      listen | 
                      pidfile |
                      includedir |
@@ -21,6 +22,7 @@
 <!ELEMENT type (#PCDATA)>
 <!ELEMENT pidfile (#PCDATA)>
 <!ELEMENT fork EMPTY>
+<!ELEMENT keep_umask EMPTY>
 
 <!ELEMENT include (#PCDATA)>
 <!ATTLIST include