mirror of
git://git.gnupg.org/gnupg.git
synced 2024-12-22 10:19:57 +01:00
agent: Fix get_client_pid for portability.
* configure.ac: Simply check getpeerucred and ucred.h, and structure members. * agent/command-ssh.c: Include ucred.h. (get_client_pid) [HAVE_STRUCT_SOCKPEERCRED_PID]: Use sockpeercred structure for OpenBSD. [LOCAL_PEERPID]: Use LOCAL_PEERPID for macOS. [LOCAL_PEEREID]: Use LOCAL_PEEREID for NetBSD. [HAVE_GETPEERUCRED]: Use getpeerucred for OpenSolaris. -- This change also addresses following bug. GnuPG-bug-id: 2981. Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
This commit is contained in:
parent
b9ab733fc0
commit
f7f806afa5
@ -40,6 +40,9 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#ifdef HAVE_UCRED_H
|
||||||
|
#include <ucred.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "agent.h"
|
#include "agent.h"
|
||||||
|
|
||||||
@ -3556,19 +3559,45 @@ ssh_request_process (ctrl_t ctrl, estream_t stream_sock)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Return the peer's pid. Stripped down code from libassuan. */
|
/* Return the peer's pid. */
|
||||||
static unsigned long
|
static unsigned long
|
||||||
get_client_pid (int fd)
|
get_client_pid (int fd)
|
||||||
{
|
{
|
||||||
pid_t client_pid = (pid_t)(-1);
|
pid_t client_pid = (pid_t)(-1);
|
||||||
|
|
||||||
#ifdef HAVE_SO_PEERCRED
|
#ifdef SO_PEERCRED
|
||||||
{
|
{
|
||||||
|
#ifdef HAVE_STRUCT_SOCKPEERCRED_PID
|
||||||
|
struct sockpeercred cr;
|
||||||
|
#else
|
||||||
struct ucred cr;
|
struct ucred cr;
|
||||||
|
#endif
|
||||||
socklen_t cl = sizeof cr;
|
socklen_t cl = sizeof cr;
|
||||||
|
|
||||||
if ( !getsockopt (fd, SOL_SOCKET, SO_PEERCRED, &cr, &cl))
|
if ( !getsockopt (fd, SOL_SOCKET, SO_PEERCRED, &cr, &cl))
|
||||||
|
{
|
||||||
|
#if defined (HAVE_STRUCT_SOCKPEERCRED_PID) || defined (HAVE_STRUCT_UCRED_PID)
|
||||||
client_pid = cr.pid;
|
client_pid = cr.pid;
|
||||||
|
#elif defined (HAVE_STRUCT_UCRED_CR_PID)
|
||||||
|
client_pid = cr.cr_pid;
|
||||||
|
#else
|
||||||
|
#error "Unknown SO_PEERCRED struct"
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#elif defined (LOCAL_PEERPID)
|
||||||
|
{
|
||||||
|
socklen_t len = sizeof (pid_t);
|
||||||
|
|
||||||
|
getsockopt(fd, SOL_LOCAL, LOCAL_PEERPID, &client_pid, &len);
|
||||||
|
}
|
||||||
|
#elif defined (LOCAL_PEEREID)
|
||||||
|
{
|
||||||
|
struct unpcbid unp;
|
||||||
|
socklen_t unpl = sizeof unp;
|
||||||
|
|
||||||
|
if (getsockopt (fd, 0, LOCAL_PEEREID, &unp, &unpl) != -1)
|
||||||
|
client_pid = unp.unp_pid;
|
||||||
}
|
}
|
||||||
#elif defined (HAVE_GETPEERUCRED)
|
#elif defined (HAVE_GETPEERUCRED)
|
||||||
{
|
{
|
||||||
@ -3580,14 +3609,6 @@ get_client_pid (int fd)
|
|||||||
ucred_free (ucred);
|
ucred_free (ucred);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#elif defined (HAVE_LOCAL_PEEREID)
|
|
||||||
{
|
|
||||||
struct unpcbid unp;
|
|
||||||
socklen_t unpl = sizeof unp;
|
|
||||||
|
|
||||||
if (getsockopt (fd, 0, LOCAL_PEEREID, &unp, &unpl) != -1)
|
|
||||||
client_pid = unp.unp_pid;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return client_pid == (pid_t)(-1)? 0 : (unsigned long)client_pid;
|
return client_pid == (pid_t)(-1)? 0 : (unsigned long)client_pid;
|
||||||
|
47
configure.ac
47
configure.ac
@ -1274,7 +1274,8 @@ AC_MSG_NOTICE([checking for header files])
|
|||||||
AC_HEADER_STDC
|
AC_HEADER_STDC
|
||||||
AC_CHECK_HEADERS([string.h unistd.h langinfo.h termio.h locale.h getopt.h \
|
AC_CHECK_HEADERS([string.h unistd.h langinfo.h termio.h locale.h getopt.h \
|
||||||
pty.h utmp.h pwd.h inttypes.h signal.h sys/select.h \
|
pty.h utmp.h pwd.h inttypes.h signal.h sys/select.h \
|
||||||
stdint.h signal.h util.h libutil.h termios.h])
|
stdint.h signal.h util.h libutil.h termios.h \
|
||||||
|
ucred.h])
|
||||||
|
|
||||||
AC_HEADER_TIME
|
AC_HEADER_TIME
|
||||||
|
|
||||||
@ -1394,49 +1395,13 @@ fi
|
|||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Check for the getsockopt SO_PEERCRED
|
# Check for the getsockopt SO_PEERCRED, etc.
|
||||||
# (This has been copied from libassuan)
|
|
||||||
#
|
#
|
||||||
AC_MSG_CHECKING(for SO_PEERCRED)
|
AC_CHECK_MEMBERS([struct ucred.pid, struct ucred.cr_pid, struct sockpeercred.pid], [], [], [#include <sys/types.h>
|
||||||
AC_CACHE_VAL(gnupg_cv_sys_so_peercred,
|
#include <sys/socket.h> ])
|
||||||
[AC_TRY_COMPILE([#include <sys/socket.h>],
|
|
||||||
[struct ucred cr;
|
|
||||||
int cl = sizeof cr;
|
|
||||||
getsockopt (1, SOL_SOCKET, SO_PEERCRED, &cr, &cl);],
|
|
||||||
gnupg_cv_sys_so_peercred=yes,
|
|
||||||
gnupg_cv_sys_so_peercred=no)
|
|
||||||
])
|
|
||||||
AC_MSG_RESULT($gnupg_cv_sys_so_peercred)
|
|
||||||
|
|
||||||
if test $gnupg_cv_sys_so_peercred = yes; then
|
|
||||||
AC_DEFINE(HAVE_SO_PEERCRED, 1,
|
|
||||||
[Defined if SO_PEERCRED is supported (Linux specific)])
|
|
||||||
else
|
|
||||||
# Check for the getsockopt LOCAL_PEEREID (NetBSD)
|
|
||||||
AC_MSG_CHECKING(for LOCAL_PEEREID)
|
|
||||||
AC_CACHE_VAL(gnupg_cv_sys_so_local_peereid,
|
|
||||||
[AC_TRY_COMPILE([#include <sys/socket.>
|
|
||||||
#include <sys/un.h>],
|
|
||||||
[struct unpcbid unp;
|
|
||||||
int unpl = sizeof unp;
|
|
||||||
getsockopt (1, SOL_SOCKET, LOCAL_PEEREID, &unp, &unpl);],
|
|
||||||
gnupg_cv_sys_so_local_peereid=yes,
|
|
||||||
gnupg_cv_sys_so_local_peereid=no)
|
|
||||||
])
|
|
||||||
AC_MSG_RESULT($gnupg_cv_sys_so_local_peereid)
|
|
||||||
|
|
||||||
if test $gnupg_cv_sys_so_local_peereid = yes; then
|
|
||||||
AC_DEFINE(HAVE_LOCAL_PEEREID, 1,
|
|
||||||
[Defined if LOCAL_PEEREID is supported (NetBSD specific)])
|
|
||||||
else
|
|
||||||
# (Open)Solaris
|
# (Open)Solaris
|
||||||
AC_CHECK_FUNCS([getpeerucred], AC_CHECK_HEADERS([ucred.h]))
|
AC_CHECK_FUNCS([getpeerucred])
|
||||||
if test $ac_cv_func_getpeerucred != yes; then
|
|
||||||
# FreeBSD
|
|
||||||
AC_CHECK_FUNCS([getpeereid])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
|
Loading…
x
Reference in New Issue
Block a user