Add LOCAL_PEEREID sockopt support for peer socket uid check

It is supported on NetBSD 5 and later.

Signed-off-by: OBATA Akio <obache@wizdas.com>
(cherry picked from commit 7827038ab4)
v3.5.13-sru
OBATA Akio 4 years ago committed by Slávek Banko
parent a9e9cfcd54
commit e83b6fdca0
No known key found for this signature in database
GPG Key ID: 608F5293A04BE668

@ -41,6 +41,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <sys/stat.h>
#include <sys/file.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <fcntl.h>
#include <unistd.h>
@ -713,10 +714,12 @@ bool DCOPClient::isSuspended() const
return !d->notifier->isEnabled();
}
#ifdef SO_PEERCRED
#if defined(SO_PEERCRED) || defined(LOCAL_PEEREID)
#define USE_PEER_IS_US
// Check whether the remote end is owned by the same user.
static bool peerIsUs(int sockfd)
{
#ifdef SO_PEERCRED
#if defined(__OpenBSD__)
struct sockpeercred cred;
#else
@ -726,6 +729,13 @@ static bool peerIsUs(int sockfd)
if (getsockopt(sockfd, SOL_SOCKET, SO_PEERCRED, &cred, &siz) != 0)
return false;
return (cred.uid == getuid());
#elif defined LOCAL_PEEREID
struct unpcbid cred;
socklen_t siz = sizeof(cred);
if (getsockopt(sockfd, 0, LOCAL_PEEREID, &cred, &siz) != 0 || siz != sizeof(cred))
return false;
return (cred.unp_euid == geteuid());
#endif
}
#else
// Check whether the socket is owned by the same user.
@ -871,7 +881,7 @@ bool DCOPClient::attachInternal( bool registerAsAnonymous )
return false;
}
#ifdef SO_PEERCRED
#ifdef USE_PEER_IS_US
d->foreign_server = !peerIsUs(socket());
#else
d->foreign_server = !isServerSocketOwnedByUser(d->serverAddr);

Loading…
Cancel
Save