diff options
Diffstat (limited to 'bus/config-parser.c')
-rw-r--r-- | bus/config-parser.c | 68 |
1 files changed, 51 insertions, 17 deletions
diff --git a/bus/config-parser.c b/bus/config-parser.c index ba1a434d..074c6218 100644 --- a/bus/config-parser.c +++ b/bus/config-parser.c @@ -123,7 +123,7 @@ struct BusConfigParser DBusList *included_files; /**< Included files stack */ - DBusHashTable *service_sid_table; /**< Map service names to SELinux contexts */ + DBusHashTable *service_context_table; /**< Map service names to SELinux contexts */ unsigned int fork : 1; /**< TRUE to fork into daemon mode */ @@ -242,12 +242,39 @@ top_element_type (BusConfigParser *parser) } static dbus_bool_t +merge_service_context_hash (DBusHashTable *dest, + DBusHashTable *from) +{ + DBusHashIter iter; + + _dbus_hash_iter_init (from, &iter); + while (_dbus_hash_iter_next (&iter)) + { + const char *service = _dbus_hash_iter_get_string_key (&iter); + const char *context = _dbus_hash_iter_get_value (&iter); + char *service_copy; + char *context_copy; + + service_copy = _dbus_strdup (service); + if (service_copy == NULL) + return FALSE; + context_copy = _dbus_strdup (context); + if (context_copy == NULL) + return FALSE; + + if (!_dbus_hash_table_insert_string (dest, service_copy, context_copy)) + return FALSE; + } + + return TRUE; +} + +static dbus_bool_t merge_included (BusConfigParser *parser, BusConfigParser *included, DBusError *error) { DBusList *link; - DBusHashTable *table; if (!bus_policy_merge (parser->policy, included->policy)) @@ -256,16 +283,12 @@ merge_included (BusConfigParser *parser, return FALSE; } - table = bus_selinux_id_table_union (parser->service_sid_table, - included->service_sid_table); - if (table == NULL) + if (!merge_service_context_hash (parser->service_context_table, + included->service_context_table)) { BUS_SET_OOM (error); return FALSE; } - - _dbus_hash_table_unref (parser->service_sid_table); - parser->service_sid_table = table; if (included->user != NULL) { @@ -342,7 +365,9 @@ bus_config_parser_new (const DBusString *basedir, if (((parser->policy = bus_policy_new ()) == NULL) || !_dbus_string_copy (basedir, 0, &parser->basedir, 0) || - ((parser->service_sid_table = bus_selinux_id_table_new ()) == NULL)) + ((parser->service_context_table = _dbus_hash_table_new (DBUS_HASH_STRING, + dbus_free, + dbus_free)) == NULL)) { if (parser->policy) bus_policy_unref (parser->policy); @@ -454,8 +479,8 @@ bus_config_parser_unref (BusConfigParser *parser) if (parser->policy) bus_policy_unref (parser->policy); - if (parser->service_sid_table) - _dbus_hash_table_unref (parser->service_sid_table); + if (parser->service_context_table) + _dbus_hash_table_unref (parser->service_context_table); dbus_free (parser); } @@ -1510,6 +1535,8 @@ start_selinux_child (BusConfigParser *parser, { const char *own; const char *context; + char *own_copy; + char *context_copy; if (!locate_attributes (parser, "associate", attribute_names, @@ -1533,8 +1560,15 @@ start_selinux_child (BusConfigParser *parser, return FALSE; } - if (!bus_selinux_id_table_insert (parser->service_sid_table, - own, context)) + own_copy = _dbus_strdup (own); + if (own_copy == NULL) + return FALSE; + context_copy = _dbus_strdup (context); + if (context_copy == NULL) + return FALSE; + + if (!_dbus_hash_table_insert_string (parser->service_context_table, + own_copy, context_copy)) { BUS_SET_OOM (error); return FALSE; @@ -2359,15 +2393,15 @@ bus_config_parser_get_limits (BusConfigParser *parser, } DBusHashTable* -bus_config_parser_steal_service_sid_table (BusConfigParser *parser) +bus_config_parser_steal_service_context_table (BusConfigParser *parser) { DBusHashTable *table; - _dbus_assert (parser->service_sid_table != NULL); /* can only steal once */ + _dbus_assert (parser->service_context_table != NULL); /* can only steal once */ - table = parser->service_sid_table; + table = parser->service_context_table; - parser->service_sid_table = NULL; + parser->service_context_table = NULL; return table; } |