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.
This commit is contained in:
Lennart Poettering 2009-05-21 01:00:52 +02:00
parent 724adb2f61
commit 89f70b1949
4 changed files with 30 additions and 1 deletions

View file

@ -57,6 +57,10 @@ send_one_message (DBusConnection *connection,
NULL)) NULL))
return TRUE; /* silently don't send it */ 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, if (!bus_transaction_send (transaction,
connection, connection,
message)) message))
@ -301,6 +305,16 @@ bus_dispatch (DBusConnection *connection,
message, &error)) message, &error))
goto out; 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 */ /* Dispatch the message */
if (!bus_transaction_send (transaction, addressed_recipient, message)) if (!bus_transaction_send (transaction, addressed_recipient, message))
{ {

View file

@ -34,7 +34,7 @@ typedef struct DBusMessageLoader DBusMessageLoader;
void _dbus_message_get_network_data (DBusMessage *message, void _dbus_message_get_network_data (DBusMessage *message,
const DBusString **header, const DBusString **header,
const DBusString **body); const DBusString **body);
void _dbus_message_get_unix_fds (DBusMessage *messgage, void _dbus_message_get_unix_fds (DBusMessage *message,
const int **fds, const int **fds,
unsigned *n_fds); unsigned *n_fds);

View file

@ -3560,6 +3560,20 @@ dbus_set_error_from_message (DBusError *error,
return TRUE; 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;
}
/** @} */ /** @} */
/** /**

View file

@ -159,6 +159,7 @@ dbus_bool_t dbus_message_get_args_valist (DBusMessage *message,
int first_arg_type, int first_arg_type,
va_list var_args); va_list var_args);
dbus_bool_t dbus_message_contains_unix_fds (DBusMessage *message);
dbus_bool_t dbus_message_iter_init (DBusMessage *message, dbus_bool_t dbus_message_iter_init (DBusMessage *message,
DBusMessageIter *iter); DBusMessageIter *iter);