From a0825e6ce0ea4b6202df925c14d6eeee52b1b782 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 29 Jan 2025 19:05:10 +0100 Subject: [PATCH] net/PeerCredentials: add getpeereid() support --- src/event/ServerSocket.cxx | 8 -------- src/net/PeerCredentials.hxx | 13 +++++++++++++ src/net/SocketDescriptor.cxx | 9 +++++++++ 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/event/ServerSocket.cxx b/src/event/ServerSocket.cxx index 0f6f06cc5..5e221d3de 100644 --- a/src/event/ServerSocket.cxx +++ b/src/event/ServerSocket.cxx @@ -105,19 +105,11 @@ static constexpr Domain server_socket_domain("server_socket"); static int get_remote_uid(SocketDescriptor s) noexcept { -#ifdef HAVE_GETPEEREID - uid_t euid; - gid_t egid; - - if (getpeereid(s.Get(), &euid, &egid) == 0) - return euid; -#else const auto cred = s.GetPeerCredentials(); if (!cred.IsDefined()) return -1; return cred.GetUid(); -#endif } inline void diff --git a/src/net/PeerCredentials.hxx b/src/net/PeerCredentials.hxx index 510f60f3b..ea2cfcc53 100644 --- a/src/net/PeerCredentials.hxx +++ b/src/net/PeerCredentials.hxx @@ -20,6 +20,9 @@ class SocketPeerCredentials { #ifdef HAVE_STRUCT_UCRED struct ucred cred; +#elif defined(HAVE_GETPEEREID) + uid_t uid; + gid_t gid; #endif public: @@ -31,6 +34,9 @@ public: c.cred.pid = 0; c.cred.uid = -1; c.cred.gid = -1; +#elif defined(HAVE_GETPEEREID) + c.uid = static_cast(-1); + c.gid = static_cast(-1); #endif return c; } @@ -38,6 +44,9 @@ public: constexpr bool IsDefined() const noexcept { #ifdef HAVE_STRUCT_UCRED return cred.pid > 0; +#elif defined(HAVE_GETPEEREID) + return uid != static_cast(-1) || + gid != static_cast(-1); #else return false; #endif @@ -54,6 +63,8 @@ public: constexpr auto GetUid() const noexcept { #ifdef HAVE_STRUCT_UCRED return cred.uid; +#elif defined(HAVE_GETPEEREID) + return uid; #else return -1; #endif @@ -62,6 +73,8 @@ public: constexpr auto GetGid() const noexcept { #ifdef HAVE_STRUCT_UCRED return cred.gid; +#elif defined(HAVE_GETPEEREID) + return gid; #else return -1; #endif diff --git a/src/net/SocketDescriptor.cxx b/src/net/SocketDescriptor.cxx index 162ccea0e..3d3ab9ada 100644 --- a/src/net/SocketDescriptor.cxx +++ b/src/net/SocketDescriptor.cxx @@ -13,6 +13,10 @@ #include "io/UniqueFileDescriptor.hxx" #endif +#ifdef HAVE_GETPEEREID +#include // for getpeereid() +#endif + #ifdef _WIN32 #include #else @@ -235,6 +239,11 @@ SocketDescriptor::GetPeerCredentials() const noexcept &cred.cred, sizeof(cred.cred)) < sizeof(cred.cred)) return SocketPeerCredentials::Undefined(); return cred; +#elif defined(HAVE_GETPEEREID) + SocketPeerCredentials cred; + return getpeereid(Get(), &cred.uid, &cred.gid) == 0 + ? cred + : SocketPeerCredentials::Undefined(); #else return SocketPeerCredentials::Undefined(); #endif