From 8d2fe98783ca1747db920fa702de66a2910d3cd1 Mon Sep 17 00:00:00 2001 From: "John (J5) Palmieri" Date: Wed, 12 Oct 2005 22:15:37 +0000 Subject: patches from Michael Krivoruchko : * dbus/dbus-connection.c (_dbus_connection_queue_received_message_link, _dbus_connection_message_sent, _dbus_connection_send_preallocated_unlocked_no_update, _dbus_connection_pop_message_link_unlocked): handle the case when path is NULL when calling _dbus_verbose * configure.in: check for functions getpeerucred and getpeereid * dbus/dbus-sysdeps.c (_dbus_read_credentials_unix_socket): provides support of auth EXTERNAL on Solaris 10+ (getpeerucred), FreeBSD 4.6+, OpenBSD 3.0+ and FreeBSD 5.0+ as well as MacOSX 10.2+ (getpeereid). Patch was only tested on Solaris 10 x86 so it might be issues with other platforms (i.e. BSDs and MacOSX) --- dbus/dbus-sysdeps.c | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) (limited to 'dbus/dbus-sysdeps.c') diff --git a/dbus/dbus-sysdeps.c b/dbus/dbus-sysdeps.c index 4ad4497d..1b7cd906 100644 --- a/dbus/dbus-sysdeps.c +++ b/dbus/dbus-sysdeps.c @@ -57,7 +57,9 @@ #ifdef HAVE_BACKTRACE #include #endif - +#ifdef HAVE_GETPEERUCRED +#include +#endif #ifndef O_BINARY #define O_BINARY 0 @@ -923,7 +925,33 @@ _dbus_read_credentials_unix_socket (int client_fd, credentials->pid = cmsg.cred.cmcred_pid; credentials->uid = cmsg.cred.cmcred_euid; credentials->gid = cmsg.cred.cmcred_groups[0]; -#else /* !SO_PEERCRED && !HAVE_CMSGCRED */ +#elif defined(HAVE_GETPEEREID) + uid_t euid; + gid_t egid; + if (getpeereid (client_fd, &euid, &egid) == 0) + { + credentials->uid = euid; + credentials->gid = egid; + } + else + { + _dbus_verbose ("Failed to getpeereid() credentials: %s\n", _dbus_strerror (errno)); + } +#elif defined(HAVE_GETPEERUCRED) + ucred_t * ucred = NULL; + if (getpeerucred (client_fd, &ucred) == 0) + { + credentials->pid = ucred_getpid (ucred); + credentials->uid = ucred_geteuid (ucred); + credentials->gid = ucred_getegid (ucred); + } + else + { + _dbus_verbose ("Failed to getpeerucred() credentials: %s\n", _dbus_strerror (errno)); + } + if (ucred != NULL) + ucred_free (ucred); +#else /* !SO_PEERCRED && !HAVE_CMSGCRED && !HAVE_GETPEEREID && !HAVE_GETPEERUCRED */ _dbus_verbose ("Socket credentials not supported on this OS\n"); #endif } -- cgit