summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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);