diff options
author | Jeremy Huddleston Sequoia <jeremyhu@apple.com> | 2023-01-18 12:19:05 -0800 |
---|---|---|
committer | Jeremy Huddleston Sequoia <jeremyhu@apple.com> | 2023-01-26 17:51:16 +0000 |
commit | 8a4ab2287398773a4868c220662d93bf84ec6241 (patch) | |
tree | c5223b565ed59dbfdd7c8682d191fbfc639cc6d1 | |
parent | 165d5c1260edcb998c5cf31d3969723c7452aa7f (diff) | |
download | xserver-8a4ab2287398773a4868c220662d93bf84ec6241.tar.gz |
os: Use LOCAL_PEERPID from sys/un.h if it is available to detemine the pid when falling back on getpeereids()
This provides a way to determine the pid of a peer connection on
systems like darwin that do not support getpeerucred() nor
SO_PEERCRED.
Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
-rw-r--r-- | include/meson.build | 1 | ||||
-rw-r--r-- | os/access.c | 18 |
2 files changed, 19 insertions, 0 deletions
diff --git a/include/meson.build b/include/meson.build index 855fbba5d..e953dfa65 100644 --- a/include/meson.build +++ b/include/meson.build @@ -133,6 +133,7 @@ conf_data.set('HAVE_FNMATCH_H', cc.has_header('fnmatch.h') ? '1' : false) conf_data.set('HAVE_LINUX_AGPGART_H', cc.has_header('linux/agpgart.h') ? '1' : false) conf_data.set('HAVE_STRINGS_H', cc.has_header('strings.h') ? '1' : false) conf_data.set('HAVE_SYS_AGPGART_H', cc.has_header('sys/agpgart.h') ? '1' : false) +conf_data.set('HAVE_SYS_UN_H', cc.has_header('sys/un.h') ? '1' : false) conf_data.set('HAVE_SYS_UTSNAME_H', cc.has_header('sys/utsname.h') ? '1' : false) conf_data.set('HAVE_SYS_SYSMACROS_H', cc.has_header('sys/sysmacros.h') ? '1' : false) diff --git a/os/access.c b/os/access.c index debf4c741..61ee8e30f 100644 --- a/os/access.c +++ b/os/access.c @@ -116,6 +116,10 @@ SOFTWARE. #endif #endif +#ifdef HAVE_SYS_UN_H +#include <sys/un.h> +#endif + #if defined(SVR4) || (defined(SYSV) && defined(__i386__)) || defined(__GNU__) #include <sys/utsname.h> #endif @@ -1176,6 +1180,10 @@ GetLocalClientCreds(ClientPtr client, LocalClientCredRec ** lccp) #elif defined(HAVE_GETPEEREID) uid_t uid; gid_t gid; +#if defined(LOCAL_PEERPID) + pid_t pid; + socklen_t so_len = sizeof(pid); +#endif #endif if (client == NULL) @@ -1253,6 +1261,16 @@ GetLocalClientCreds(ClientPtr client, LocalClientCredRec ** lccp) lcc->euid = uid; lcc->egid = gid; lcc->fieldsSet = LCC_UID_SET | LCC_GID_SET; + +#if defined(LOCAL_PEERPID) + if (getsockopt(fd, SOL_LOCAL, LOCAL_PEERPID, &pid, &so_len) != 0) { + ErrorF("getsockopt failed to determine pid of socket %d: %s\n", fd, strerror(errno)); + } else { + lcc->pid = pid; + lcc->fieldsSet |= LCC_PID_SET; + } +#endif + return 0; #endif #else |