diff options
Diffstat (limited to 'bus')
-rw-r--r-- | bus/bus.c | 5 | ||||
-rw-r--r-- | bus/config-parser-common.c | 8 | ||||
-rw-r--r-- | bus/config-parser-common.h | 3 | ||||
-rw-r--r-- | bus/config-parser.c | 32 | ||||
-rw-r--r-- | bus/config-parser.h | 1 | ||||
-rw-r--r-- | bus/dbus-daemon.1.in | 7 | ||||
-rw-r--r-- | bus/session.conf.in | 4 |
7 files changed, 56 insertions, 4 deletions
@@ -55,6 +55,7 @@ struct BusContext BusLimits limits; unsigned int fork : 1; unsigned int syslog : 1; + unsigned int keep_umask : 1; }; static dbus_int32_t server_data_slot = -1; @@ -386,6 +387,7 @@ process_config_first_time_only (BusContext *context, context->fork = bus_config_parser_get_fork (parser); context->syslog = bus_config_parser_get_syslog (parser); + context->keep_umask = bus_config_parser_get_keep_umask (parser); _DBUS_ASSERT_ERROR_IS_CLEAR (error); retval = TRUE; @@ -710,7 +712,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; diff --git a/bus/config-parser-common.c b/bus/config-parser-common.c index ce590861..88e099ac 100644 --- a/bus/config-parser-common.c +++ b/bus/config-parser-common.c @@ -118,6 +118,10 @@ bus_config_parser_element_name_to_type (const char *name) { return ELEMENT_SYSLOG; } + else if (strcmp (name, "keep_umask") == 0) + { + return ELEMENT_KEEP_UMASK; + } return ELEMENT_NONE; } @@ -168,7 +172,9 @@ bus_config_parser_element_type_to_name (ElementType type) return "associate"; case ELEMENT_SYSLOG: return "syslog"; - } + case ELEMENT_KEEP_UMASK: + return "keep_umask"; + } _dbus_assert_not_reached ("bad element type"); diff --git a/bus/config-parser-common.h b/bus/config-parser-common.h index 4ecaa8d8..ae40d089 100644 --- a/bus/config-parser-common.h +++ b/bus/config-parser-common.h @@ -48,7 +48,8 @@ typedef enum ELEMENT_ASSOCIATE, ELEMENT_STANDARD_SESSION_SERVICEDIRS, ELEMENT_STANDARD_SYSTEM_SERVICEDIRS, - ELEMENT_SYSLOG + ELEMENT_SYSLOG, + ELEMENT_KEEP_UMASK } ElementType; ElementType bus_config_parser_element_name_to_type (const char *element_name); diff --git a/bus/config-parser.c b/bus/config-parser.c index a8de3ff3..38ce8a1d 100644 --- a/bus/config-parser.c +++ b/bus/config-parser.c @@ -112,6 +112,7 @@ struct BusConfigParser unsigned int fork : 1; /**< TRUE to fork into daemon mode */ unsigned int syslog : 1; /**< TRUE to enable syslog */ + 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 */ }; @@ -308,6 +309,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); @@ -710,11 +714,26 @@ start_busconfig_child (BusConfigParser *parser, BUS_SET_OOM (error); return FALSE; } - + parser->syslog = 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) { if (!check_no_attributes (parser, "pidfile", attribute_names, attribute_values, error)) @@ -1970,6 +1989,7 @@ bus_config_parser_end_element (BusConfigParser *parser, case ELEMENT_DENY: case ELEMENT_FORK: case ELEMENT_SYSLOG: + case ELEMENT_KEEP_UMASK: case ELEMENT_SELINUX: case ELEMENT_ASSOCIATE: case ELEMENT_STANDARD_SESSION_SERVICEDIRS: @@ -2256,6 +2276,7 @@ bus_config_parser_content (BusConfigParser *parser, case ELEMENT_DENY: case ELEMENT_FORK: case ELEMENT_SYSLOG: + case ELEMENT_KEEP_UMASK: case ELEMENT_STANDARD_SESSION_SERVICEDIRS: case ELEMENT_STANDARD_SYSTEM_SERVICEDIRS: case ELEMENT_SELINUX: @@ -2584,6 +2605,12 @@ bus_config_parser_get_syslog (BusConfigParser *parser) return parser->syslog; } +dbus_bool_t +bus_config_parser_get_keep_umask (BusConfigParser *parser) +{ + return parser->keep_umask; +} + const char * bus_config_parser_get_pidfile (BusConfigParser *parser) { @@ -2977,6 +3004,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; diff --git a/bus/config-parser.h b/bus/config-parser.h index b951d1d2..bb3a30f4 100644 --- a/bus/config-parser.h +++ b/bus/config-parser.h @@ -67,6 +67,7 @@ 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_allow_anonymous (BusConfigParser *parser); dbus_bool_t bus_config_parser_get_syslog (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); diff --git a/bus/dbus-daemon.1.in b/bus/dbus-daemon.1.in index 81439343..8342600e 100644 --- a/bus/dbus-daemon.1.in +++ b/bus/dbus-daemon.1.in @@ -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 diff --git a/bus/session.conf.in b/bus/session.conf.in index b2dee5b3..794eb8da 100644 --- a/bus/session.conf.in +++ b/bus/session.conf.in @@ -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 /> |