mirror of
https://gitlab.freedesktop.org/dbus/dbus.git
synced 2026-05-04 17:38:09 +02:00
Bug 18446: Keep umask for session bus
Signed-off-by: Colin Walters <walters@verbum.org>
This commit is contained in:
parent
9928648f16
commit
6663d1dd35
11 changed files with 72 additions and 10 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;
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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,9 +714,24 @@ 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)
|
||||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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>"
|
||||
|
||||
|
|
|
|||
|
|
@ -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 />
|
||||
|
|
|
|||
|
|
@ -70,12 +70,14 @@
|
|||
* @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;
|
||||
|
|
@ -122,9 +124,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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue