diff options
author | Alban Crequy <alban.crequy@collabora.co.uk> | 2014-07-18 16:45:07 +0100 |
---|---|---|
committer | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2014-09-15 19:22:01 +0100 |
commit | 52abb5172f7426bb3f1dbe63a2b3a2d2ea7e7ac2 (patch) | |
tree | 546e1491d68159eba541414022b8946c5547a687 | |
parent | e17a921be676bcc89373ec1a9f368fe8b36f1073 (diff) | |
download | dbus-52abb5172f7426bb3f1dbe63a2b3a2d2ea7e7ac2.tar.gz |
DBusConnection: implements _dbus_connection_get_pending_fds_count
This is one of four commits needed to address CVE-2014-3637.
This will allow the bus to know whether there are pending file descriptors in a
DBusConnection's DBusMessageLoader.
https://bugs.freedesktop.org/show_bug.cgi?id=80559
Reviewed-by: Simon McVittie <simon.mcvittie@collabora.co.uk>
[fix compilation on platforms that do not HAVE_UNIX_FD_PASSING -smcv]
Signed-off-by: Simon McVittie <simon.mcvittie@collabora.co.uk>
(cherry picked from commit 995734750cea65012537748ee56488c707d2f027)
Conflicts:
dbus/dbus-message.c
-rw-r--r-- | dbus/dbus-connection-internal.h | 1 | ||||
-rw-r--r-- | dbus/dbus-connection.c | 11 | ||||
-rw-r--r-- | dbus/dbus-message-internal.h | 1 | ||||
-rw-r--r-- | dbus/dbus-message.c | 15 | ||||
-rw-r--r-- | dbus/dbus-transport.c | 11 | ||||
-rw-r--r-- | dbus/dbus-transport.h | 1 |
6 files changed, 40 insertions, 0 deletions
diff --git a/dbus/dbus-connection-internal.h b/dbus/dbus-connection-internal.h index 3d37f188..f5edf3ca 100644 --- a/dbus/dbus-connection-internal.h +++ b/dbus/dbus-connection-internal.h @@ -100,6 +100,7 @@ void _dbus_connection_test_get_locks (DBusConnectio DBusMutex **io_path_mutex_loc, DBusCondVar **dispatch_cond_loc, DBusCondVar **io_path_cond_loc); +int _dbus_connection_get_pending_fds_count (DBusConnection *connection); /* if DBUS_ENABLE_STATS */ void _dbus_connection_get_stats (DBusConnection *connection, diff --git a/dbus/dbus-connection.c b/dbus/dbus-connection.c index b175a445..07a9ebf1 100644 --- a/dbus/dbus-connection.c +++ b/dbus/dbus-connection.c @@ -2532,6 +2532,17 @@ _dbus_connection_block_pending_call (DBusPendingCall *pending) dbus_pending_call_unref (pending); } +/** + * Return how many file descriptors are pending in the loader + * + * @param connection the connection + */ +int +_dbus_connection_get_pending_fds_count (DBusConnection *connection) +{ + return _dbus_transport_get_pending_fds_count (connection->transport); +} + /** @} */ /** diff --git a/dbus/dbus-message-internal.h b/dbus/dbus-message-internal.h index c1948732..de03edd4 100644 --- a/dbus/dbus-message-internal.h +++ b/dbus/dbus-message-internal.h @@ -97,6 +97,7 @@ long _dbus_message_loader_get_max_message_size (DBusMessageLoader void _dbus_message_loader_set_max_message_unix_fds(DBusMessageLoader *loader, long n); long _dbus_message_loader_get_max_message_unix_fds(DBusMessageLoader *loader); +int _dbus_message_loader_get_pending_fds_count (DBusMessageLoader *loader); typedef struct DBusInitialFDs DBusInitialFDs; DBusInitialFDs *_dbus_check_fdleaks_enter (void); diff --git a/dbus/dbus-message.c b/dbus/dbus-message.c index b0c641ea..5d70f69d 100644 --- a/dbus/dbus-message.c +++ b/dbus/dbus-message.c @@ -4428,6 +4428,21 @@ static DBusDataSlotAllocator slot_allocator; _DBUS_DEFINE_GLOBAL_LOCK (message_slots); /** + * Return how many file descriptors are pending in the loader + * + * @param loader the loader + */ +int +_dbus_message_loader_get_pending_fds_count (DBusMessageLoader *loader) +{ +#ifdef HAVE_UNIX_FD_PASSING + return loader->n_unix_fds; +#else + return 0; +#endif +} + +/** * Allocates an integer ID to be used for storing application-specific * data on any DBusMessage. The allocated ID may then be used * with dbus_message_set_data() and dbus_message_get_data(). diff --git a/dbus/dbus-transport.c b/dbus/dbus-transport.c index 6b58fda2..e4d03c11 100644 --- a/dbus/dbus-transport.c +++ b/dbus/dbus-transport.c @@ -1491,6 +1491,17 @@ _dbus_transport_set_allow_anonymous (DBusTransport *transport, transport->allow_anonymous = value != FALSE; } +/** + * Return how many file descriptors are pending in the loader + * + * @param transport the transport + */ +int +_dbus_transport_get_pending_fds_count (DBusTransport *transport) +{ + return _dbus_message_loader_get_pending_fds_count (transport->loader); +} + #ifdef DBUS_ENABLE_STATS void _dbus_transport_get_stats (DBusTransport *transport, diff --git a/dbus/dbus-transport.h b/dbus/dbus-transport.h index 4b821517..6a3a8b3f 100644 --- a/dbus/dbus-transport.h +++ b/dbus/dbus-transport.h @@ -96,6 +96,7 @@ dbus_bool_t _dbus_transport_set_auth_mechanisms (DBusTransport const char **mechanisms); void _dbus_transport_set_allow_anonymous (DBusTransport *transport, dbus_bool_t value); +int _dbus_transport_get_pending_fds_count (DBusTransport *transport); /* if DBUS_ENABLE_STATS */ void _dbus_transport_get_stats (DBusTransport *transport, |