From: Lennart Poettering Date: Wed, 20 May 2009 23:00:52 +0000 (+0200) Subject: bus: don't forward messages with unix fds on connections that don't support it X-Git-Tag: dbus-1.3.0~4^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=89f70b19495e9c3dadbbb7b51ce1629fa22ea3af;p=thirdparty%2Fdbus.git bus: don't forward messages with unix fds on connections that don't support it This simply verifies that we forward unix fds only on connection that support it. We willr eturn an error if a client attempts to send a message with unix fds to another client that cannot do it. --- diff --git a/bus/dispatch.c b/bus/dispatch.c index 8ed88dad4..fa5874d2a 100644 --- a/bus/dispatch.c +++ b/bus/dispatch.c @@ -56,6 +56,10 @@ send_one_message (DBusConnection *connection, message, NULL)) return TRUE; /* silently don't send it */ + + if (dbus_message_contains_unix_fds(message) && + !dbus_connection_can_send_type(connection, DBUS_TYPE_UNIX_FD)) + return TRUE; /* silently don't send it */ if (!bus_transaction_send (transaction, connection, @@ -300,6 +304,16 @@ bus_dispatch (DBusConnection *connection, addressed_recipient, message, &error)) goto out; + + if (dbus_message_contains_unix_fds(message) && + !dbus_connection_can_send_type(addressed_recipient, DBUS_TYPE_UNIX_FD)) + { + dbus_set_error(&error, + DBUS_ERROR_NOT_SUPPORTED, + "Tried to send message with Unix file descriptors" + "to a client that doesn't support that."); + goto out; + } /* Dispatch the message */ if (!bus_transaction_send (transaction, addressed_recipient, message)) diff --git a/dbus/dbus-message-internal.h b/dbus/dbus-message-internal.h index 0565d6115..4302f0916 100644 --- a/dbus/dbus-message-internal.h +++ b/dbus/dbus-message-internal.h @@ -34,7 +34,7 @@ typedef struct DBusMessageLoader DBusMessageLoader; void _dbus_message_get_network_data (DBusMessage *message, const DBusString **header, const DBusString **body); -void _dbus_message_get_unix_fds (DBusMessage *messgage, +void _dbus_message_get_unix_fds (DBusMessage *message, const int **fds, unsigned *n_fds); diff --git a/dbus/dbus-message.c b/dbus/dbus-message.c index d9ea649ea..d8d746a63 100644 --- a/dbus/dbus-message.c +++ b/dbus/dbus-message.c @@ -3560,6 +3560,20 @@ dbus_set_error_from_message (DBusError *error, return TRUE; } +/** + * Checks whether a message contains unix fds + * + * @param message the message + * @returns #TRUE if the message contains unix fds + */ +dbus_bool_t +dbus_message_contains_unix_fds(DBusMessage *message) +{ + _dbus_assert(message); + + return message->n_unix_fds > 0; +} + /** @} */ /** diff --git a/dbus/dbus-message.h b/dbus/dbus-message.h index 2e29fef00..3a3ddd969 100644 --- a/dbus/dbus-message.h +++ b/dbus/dbus-message.h @@ -159,6 +159,7 @@ dbus_bool_t dbus_message_get_args_valist (DBusMessage *message, int first_arg_type, va_list var_args); +dbus_bool_t dbus_message_contains_unix_fds (DBusMessage *message); dbus_bool_t dbus_message_iter_init (DBusMessage *message, DBusMessageIter *iter);