diff options
Diffstat (limited to 'bus/activation.c')
-rw-r--r-- | bus/activation.c | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/bus/activation.c b/bus/activation.c index 868ce05c..bdf9cf3d 100644 --- a/bus/activation.c +++ b/bus/activation.c @@ -637,7 +637,7 @@ update_directory (BusActivation *activation, if (!_dbus_string_ends_with_c_str (&filename, ".service")) { - _dbus_verbose ("Skipping non-.service file %s\n", + _dbus_verbose ("Skipping non-.service file '%s'\n", _dbus_string_get_const_data (&filename)); continue; } @@ -1044,7 +1044,7 @@ restore_pending (void *data) } static void -free_pending_restore_data (void *data) +free_restore_pending_data (void *data) { RestorePendingData *d = data; @@ -1074,9 +1074,9 @@ add_restore_pending_to_transaction (BusTransaction *transaction, if (d->hash_entry == NULL || !bus_transaction_add_cancel_hook (transaction, restore_pending, d, - free_pending_restore_data)) + free_restore_pending_data)) { - free_pending_restore_data (d); + free_restore_pending_data (d); return FALSE; } @@ -1162,14 +1162,11 @@ bus_activation_service_created (BusActivation *activation, dbus_bool_t bus_activation_send_pending_auto_activation_messages (BusActivation *activation, BusService *service, - BusTransaction *transaction, - DBusError *error) + BusTransaction *transaction) { BusPendingActivation *pending_activation; DBusList *link; - _DBUS_ASSERT_ERROR_IS_CLEAR (error); - /* Check if it's a pending activation */ pending_activation = _dbus_hash_table_lookup_string (activation->pending_activations, bus_service_get_name (service)); @@ -1186,6 +1183,9 @@ bus_activation_send_pending_auto_activation_messages (BusActivation *activation if (entry->auto_activation && (entry->connection == NULL || dbus_connection_get_is_connected (entry->connection))) { DBusConnection *addressed_recipient; + DBusError error; + + dbus_error_init (&error); addressed_recipient = bus_service_get_primary_owners_connection (service); @@ -1193,8 +1193,22 @@ bus_activation_send_pending_auto_activation_messages (BusActivation *activation if (!bus_dispatch_matches (transaction, entry->connection, addressed_recipient, - entry->activation_message, error)) - goto error; + entry->activation_message, &error)) + { + /* If permission is denied, we just want to return the error + * to the original method invoker; in particular, we don't + * want to make the RequestName call fail with that error + * (see fd.o #78979, CVE-2014-3477). */ + if (!bus_transaction_send_error_reply (transaction, entry->connection, + &error, entry->activation_message)) + { + bus_connection_send_oom_error (entry->connection, + entry->activation_message); + } + + link = next; + continue; + } } link = next; @@ -1203,7 +1217,6 @@ bus_activation_send_pending_auto_activation_messages (BusActivation *activation if (!add_restore_pending_to_transaction (transaction, pending_activation)) { _dbus_verbose ("Could not add cancel hook to transaction to revert removing pending activation\n"); - BUS_SET_OOM (error); goto error; } @@ -2186,7 +2199,7 @@ bus_activation_list_services (BusActivation *activation, error: for (j = 0; j < i; j++) - dbus_free (retval[i]); + dbus_free (retval[j]); dbus_free (retval); return FALSE; |