summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2009-05-21 01:00:52 +0200
committerLennart Poettering <lennart@poettering.net>2009-05-21 01:21:35 +0200
commit89f70b19495e9c3dadbbb7b51ce1629fa22ea3af (patch)
tree404dabfc98634a6aa025f6d74b432cff49e60e14
parent724adb2f61bd8a6ea41932e04df9303d0a1eed18 (diff)
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.
-rw-r--r--bus/dispatch.c14
-rw-r--r--dbus/dbus-message-internal.h2
-rw-r--r--dbus/dbus-message.c14
-rw-r--r--dbus/dbus-message.h1
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);