]> git.ipfire.org Git - thirdparty/dbus.git/commitdiff
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 d9fd2d9e77b8789a572602e13c749ca69e0bcefa..e5733fecb2e4f10418d3b29e55e55abd8f814c4a 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 6e4bb701b4c956d6b246f30d06ca65d621ac6e5d..1e0f7f9103bf1078cb42b90dfe8e38cb7519848a 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 3718c9588fe5a9eaeb43e92c51937ece33c78513..01eb118be8801f7e89a63285b8bf526c032ffb7e 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 f9e0b7d7378b23c5c8de82321e6d16a1d3040f0c..5bb34f17fa303d98d7485a0cd907a69e2d39938e 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);
@@ -696,6 +701,21 @@ start_busconfig_child (BusConfigParser   *parser,
 
       parser->fork = TRUE;
       
+      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)
@@ -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 ec0dfed1cbfca3a9d6378b2f8920dcd0d263e037..6d69f3da833ff13280785db76083235d62622dd6 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 5599afe6f6375d316723e06572ab827181e5aad1..7666f180fc0a5a2821c5754f9380867f917d8929 100644 (file)
@@ -213,6 +213,13 @@ If present, the bus daemon becomes a real daemon (forks
 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>"
 
index b2dee5b36fda7da01992617ac5c9fe9383b80451..794eb8da8dfd59e97104a19371022fc344441288 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 0343a90c3cc6aea3712ece3caef53aa70427a76a..d8718c2160e0cfcd7ac01b40d4125a03f121794c 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 8608ad0e4964b4aa973bbd80cce2dee8912e7890..6358531bb40fc242d1231f7b69153c24888b4fb9 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 80236f05efb059fb7f46416495550fb31960f620..469b5e523764e48524cdf0ac7b85c6fd4abac6ac 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 84593fe08fcb4d00003f5fc78e4a3cbaae8d640d..0cc519b4d7b8ef66a095c6e5fec682a29600ad8e 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