diff options
-rw-r--r-- | bus/dispatch.c | 14 | ||||
-rw-r--r-- | dbus/dbus-message-internal.h | 2 | ||||
-rw-r--r-- | dbus/dbus-message.c | 14 | ||||
-rw-r--r-- | dbus/dbus-message.h | 1 |
4 files changed, 30 insertions, 1 deletions
diff --git a/bus/dispatch.c b/bus/dispatch.c index 8ed88dad..fa5874d2 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 0565d611..4302f091 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 d9ea649e..d8d746a6 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 2e29fef0..3a3ddd96 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); |