mirror of
git://git.gnupg.org/gnupg.git
synced 2025-07-02 22:46:30 +02:00
agent: Tell the Pinentry the client's pid.
* configure.ac: Check for SO_PEERCRED et al. * agent/agent.h (server_control_s): Add field 'client_pid'. * agent/command.c (start_command_handler): Set CLIENT_PID. * agent/command-ssh.c (get_client_pid): New. (start_command_handler_ssh): Set CLIENT_PID. * agent/call-pinentry.c (start_pinentry): Tell Pinentry the client-pid. Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
parent
7052a0d77c
commit
309f464a59
5 changed files with 110 additions and 1 deletions
|
@ -3491,6 +3491,44 @@ ssh_request_process (ctrl_t ctrl, estream_t stream_sock)
|
|||
}
|
||||
|
||||
|
||||
/* Return the peer's pid. Stripped down code from libassuan. */
|
||||
static unsigned long
|
||||
get_client_pid (int fd)
|
||||
{
|
||||
pid_t client_pid = (pid_t)(-1);
|
||||
|
||||
#ifdef HAVE_SO_PEERCRED
|
||||
{
|
||||
struct ucred cr;
|
||||
socklen_t cl = sizeof cr;
|
||||
|
||||
if ( !getsockopt (fd, SOL_SOCKET, SO_PEERCRED, &cr, &cl))
|
||||
client_pid = cr.pid;
|
||||
}
|
||||
#elif defined (HAVE_GETPEERUCRED)
|
||||
{
|
||||
ucred_t *ucred = NULL;
|
||||
|
||||
if (getpeerucred (fd, &ucred) != -1)
|
||||
{
|
||||
client_pid= ucred_getpid (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
|
||||
|
||||
return client_pid == (pid_t)(-1)? 0 : (unsigned long)client_pid;
|
||||
}
|
||||
|
||||
|
||||
/* Start serving client on SOCK_CLIENT. */
|
||||
void
|
||||
start_command_handler_ssh (ctrl_t ctrl, gnupg_fd_t sock_client)
|
||||
|
@ -3503,6 +3541,8 @@ start_command_handler_ssh (ctrl_t ctrl, gnupg_fd_t sock_client)
|
|||
if (err)
|
||||
goto out;
|
||||
|
||||
ctrl->client_pid = get_client_pid (FD2INT(sock_client));
|
||||
|
||||
/* Create stream from socket. */
|
||||
stream_sock = es_fdopen (FD2INT(sock_client), "r+");
|
||||
if (!stream_sock)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue