diff options
author | David Zeuthen <davidz@redhat.com> | 2005-04-13 14:27:11 +0000 |
---|---|---|
committer | David Zeuthen <davidz@redhat.com> | 2005-04-13 14:27:11 +0000 |
commit | 44656f538f69e8f8709ddb6ab285db29f65f62dd (patch) | |
tree | 7481890277faf957d3130bd1a9b32e128f786537 | |
parent | 893f5b7bf561922dafae9d8397b82ee9ee35ad49 (diff) |
2005-04-13 David Zeuthen <davidz@redhat.com>
* bus/selinux.c: Add c-file-style to top of file
(log_audit_callback): Don't free the data here anymore
(bus_selinux_check): Don't take spid and tpid since appending
that to auxdata may OOM.
(bus_selinux_allows_acquire_service): Handle OOM and signal back
to the caller if we are OOM by taking an error object.
(bus_selinux_allows_send): -do-
* bus/selinux.h: Fix prototypes for bus_selinux_allows_acquire_service
and bus_selinux_allows_send
* bus/bus.c (bus_context_check_security_policy): Pass error and
pass on OOM thrown by bus_selinux_allows_send()
* bus/services.c (bus_registry_acquire_service): Pass error and
pass on OOM thrown by bus_selinux_allows_acquire_service()
-rw-r--r-- | ChangeLog | 19 | ||||
-rw-r--r-- | bus/bus.c | 10 | ||||
-rw-r--r-- | bus/selinux.c | 168 | ||||
-rw-r--r-- | bus/selinux.h | 7 | ||||
-rw-r--r-- | bus/services.c | 9 |
5 files changed, 152 insertions, 61 deletions
@@ -1,3 +1,22 @@ +2005-04-13 David Zeuthen <davidz@redhat.com> + + * bus/selinux.c: Add c-file-style to top of file + (log_audit_callback): Don't free the data here anymore + (bus_selinux_check): Don't take spid and tpid since appending + that to auxdata may OOM. + (bus_selinux_allows_acquire_service): Handle OOM and signal back + to the caller if we are OOM by taking an error object. + (bus_selinux_allows_send): -do- + + * bus/selinux.h: Fix prototypes for bus_selinux_allows_acquire_service + and bus_selinux_allows_send + + * bus/bus.c (bus_context_check_security_policy): Pass error and + pass on OOM thrown by bus_selinux_allows_send() + + * bus/services.c (bus_registry_acquire_service): Pass error and + pass on OOM thrown by bus_selinux_allows_acquire_service() + 2005-04-13 Havoc Pennington <hp@redhat.com> * glib/dbus-gmain.c (message_queue_dispatch): only dispatch one @@ -1139,8 +1139,16 @@ bus_context_check_security_policy (BusContext *context, dbus_message_get_interface (message), dbus_message_get_member (message), dbus_message_get_error_name (message), - dest ? dest : DBUS_SERVICE_DBUS)) + dest ? dest : DBUS_SERVICE_DBUS, error)) { + + if (dbus_error_is_set (error) && + dbus_error_has_name (error, DBUS_ERROR_NO_MEMORY)) + { + return FALSE; + } + + dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED, "An SELinux policy prevents this sender " "from sending this message to this recipient " diff --git a/bus/selinux.c b/bus/selinux.c index 5cb4438a..c647a77b 100644 --- a/bus/selinux.c +++ b/bus/selinux.c @@ -1,4 +1,5 @@ -/* selinux.c SELinux security checks for D-BUS +/* -*- mode: C; c-file-style: "gnu" -*- + * selinux.c SELinux security checks for D-BUS * * Author: Matthew Rickard <mjricka@epoch.ncsc.mil> * @@ -131,8 +132,6 @@ log_audit_callback (void *data, security_class_t class, char *buf, size_t buflef { DBusString *audmsg = data; _dbus_string_copy_to_buffer (audmsg, buf, bufleft); - _dbus_string_free (audmsg); - dbus_free (audmsg); } /** @@ -363,20 +362,10 @@ bus_selinux_check (BusSELinuxID *sender_sid, BusSELinuxID *override_sid, security_class_t target_class, access_vector_t requested, - unsigned long spid, - unsigned long tpid, DBusString *auxdata) { if (!selinux_enabled) return TRUE; - - if (auxdata) - { - if (spid && _dbus_string_append (auxdata, " spid=")) - _dbus_string_append_uint (auxdata, spid); - if (tpid && _dbus_string_append (auxdata, " tpid=")) - _dbus_string_append_uint (auxdata, tpid); - } /* Make the security check. AVC checks enforcing mode here as well. */ if (avc_has_perm (SELINUX_SID_FROM_BUS (sender_sid), @@ -404,39 +393,54 @@ bus_selinux_check (BusSELinuxID *sender_sid, dbus_bool_t bus_selinux_allows_acquire_service (DBusConnection *connection, BusSELinuxID *service_sid, - const char *service_name) + const char *service_name, + DBusError *error) { #ifdef HAVE_SELINUX BusSELinuxID *connection_sid; unsigned long spid; - DBusString *auxdata; + DBusString auxdata; + dbus_bool_t ret; if (!selinux_enabled) return TRUE; - + connection_sid = bus_connection_get_selinux_id (connection); if (!dbus_connection_get_unix_process_id (connection, &spid)) spid = 0; - auxdata = dbus_new0 (DBusString, 1); - if (auxdata) + if (!_dbus_string_init (&auxdata)) + goto oom; + + if (!_dbus_string_append (&auxdata, "service=")) + goto oom; + + if (!_dbus_string_append (&auxdata, service_name)) + goto oom; + + if (spid) { - if (!_dbus_string_init (auxdata)) - { - dbus_free (auxdata); - auxdata = NULL; - } - else if (_dbus_string_append (auxdata, "service=")) - _dbus_string_append (auxdata, service_name); + if (!_dbus_string_append (&auxdata, " spid=")) + goto oom; + + if (!_dbus_string_append_uint (&auxdata, spid)) + goto oom; } - return bus_selinux_check (connection_sid, - service_sid, - SECCLASS_DBUS, - DBUS__ACQUIRE_SVC, - spid, - 0, - auxdata); + ret = bus_selinux_check (connection_sid, + service_sid, + SECCLASS_DBUS, + DBUS__ACQUIRE_SVC, + &auxdata); + + _dbus_string_free (&auxdata); + return ret; + + oom: + _dbus_string_free (&auxdata); + BUS_SET_OOM (error); + return FALSE; + #else return TRUE; #endif /* HAVE_SELINUX */ @@ -459,13 +463,15 @@ bus_selinux_allows_send (DBusConnection *sender, const char *interface, const char *member, const char *error_name, - const char *destination) + const char *destination, + DBusError *error) { #ifdef HAVE_SELINUX BusSELinuxID *recipient_sid; BusSELinuxID *sender_sid; unsigned long spid, tpid; - DBusString *auxdata; + DBusString auxdata; + dbus_bool_t ret; if (!selinux_enabled) return TRUE; @@ -475,27 +481,63 @@ bus_selinux_allows_send (DBusConnection *sender, if (!proposed_recipient || !dbus_connection_get_unix_process_id (proposed_recipient, &tpid)) tpid = 0; - auxdata = dbus_new0 (DBusString, 1); - if (auxdata) + if (!_dbus_string_init (&auxdata)) + goto oom; + + if (!_dbus_string_append (&auxdata, "msgtype=")) + goto oom; + + if (!_dbus_string_append (&auxdata, msgtype)) + goto oom; + + if (interface) { - if (!_dbus_string_init (auxdata)) - { - dbus_free (auxdata); - auxdata = NULL; - } - else - { - if (_dbus_string_append (auxdata, "msgtype=")) - _dbus_string_append (auxdata, msgtype); - if (interface && _dbus_string_append (auxdata, " interface=")) - _dbus_string_append (auxdata, interface); - if (member && _dbus_string_append (auxdata, " member=")) - _dbus_string_append (auxdata, member); - if (error_name && _dbus_string_append (auxdata, " error_name=")) - _dbus_string_append (auxdata, error_name); - if (destination && _dbus_string_append (auxdata, " dest=")) - _dbus_string_append (auxdata, destination); - } + if (!_dbus_string_append (&auxdata, " interface=")) + goto oom; + if (!_dbus_string_append (&auxdata, interface)) + goto oom; + } + + if (member) + { + if (!_dbus_string_append (&auxdata, " member=")) + goto oom; + if (!_dbus_string_append (&auxdata, member)) + goto oom; + } + + if (error_name) + { + if (!_dbus_string_append (&auxdata, " error_name=")) + goto oom; + if (!_dbus_string_append (&auxdata, error_name)) + goto oom; + } + + if (destination) + { + if (!_dbus_string_append (&auxdata, " dest=")) + goto oom; + if (!_dbus_string_append (&auxdata, destination)) + goto oom; + } + + if (spid) + { + if (!_dbus_string_append (&auxdata, " spid=")) + goto oom; + + if (!_dbus_string_append_uint (&auxdata, spid)) + goto oom; + } + + if (tpid) + { + if (!_dbus_string_append (&auxdata, " tpid=")) + goto oom; + + if (!_dbus_string_append_uint (&auxdata, tpid)) + goto oom; } sender_sid = bus_connection_get_selinux_id (sender); @@ -505,9 +547,21 @@ bus_selinux_allows_send (DBusConnection *sender, else recipient_sid = BUS_SID_FROM_SELINUX (bus_sid); - return bus_selinux_check (sender_sid, recipient_sid, - SECCLASS_DBUS, DBUS__SEND_MSG, - spid, tpid, auxdata); + ret = bus_selinux_check (sender_sid, + recipient_sid, + SECCLASS_DBUS, + DBUS__SEND_MSG, + &auxdata); + + _dbus_string_free (&auxdata); + + return ret; + + oom: + _dbus_string_free (&auxdata); + BUS_SET_OOM (error); + return FALSE; + #else return TRUE; #endif /* HAVE_SELINUX */ diff --git a/bus/selinux.h b/bus/selinux.h index 3627126c..4424fa82 100644 --- a/bus/selinux.h +++ b/bus/selinux.h @@ -48,14 +48,17 @@ const char* bus_selinux_get_policy_root (void); dbus_bool_t bus_selinux_allows_acquire_service (DBusConnection *connection, BusSELinuxID *service_sid, - const char *service_name); + const char *service_name, + DBusError *error); + dbus_bool_t bus_selinux_allows_send (DBusConnection *sender, DBusConnection *proposed_recipient, const char *msgtype, /* Supplementary audit data */ const char *interface, const char *member, const char *error_name, - const char *destination); + const char *destination, + DBusError *error); BusSELinuxID* bus_selinux_init_connection_id (DBusConnection *connection, DBusError *error); diff --git a/bus/services.c b/bus/services.c index 4392daa2..7a22dce7 100644 --- a/bus/services.c +++ b/bus/services.c @@ -319,8 +319,15 @@ bus_registry_acquire_service (BusRegistry *registry, service_name); if (!bus_selinux_allows_acquire_service (connection, sid, - _dbus_string_get_const_data (service_name))) + _dbus_string_get_const_data (service_name), error)) { + + if (dbus_error_is_set (error) && + dbus_error_has_name (error, DBUS_ERROR_NO_MEMORY)) + { + goto out; + } + dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED, "Connection \"%s\" is not allowed to own the service \"%s\" due " "to SELinux policy", |