1- /* $OpenBSD: ssh-agent.c,v 1.305 2024/03/06 00:31:04 djm Exp $ */
1+ /* $OpenBSD: ssh-agent.c,v 1.306 2024/03/09 05:12:13 djm Exp $ */
22/*
33 * Author: Tatu Ylonen <[email protected] > 44 * Copyright (c) 1995 Tatu Ylonen <[email protected] >, Espoo, Finland @@ -162,6 +162,8 @@ int max_fd = 0;
162162pid_t parent_pid = -1 ;
163163time_t parent_alive_interval = 0 ;
164164
165+ sig_atomic_t signalled = 0 ;
166+
165167/* pid of process for which cleanup_socket is applicable */
166168pid_t cleanup_pid = 0 ;
167169
@@ -2062,7 +2064,7 @@ after_poll(struct pollfd *pfd, size_t npfd, u_int maxfds)
20622064}
20632065
20642066static int
2065- prepare_poll (struct pollfd * * pfdp , size_t * npfdp , int * timeoutp , u_int maxfds )
2067+ prepare_poll (struct pollfd * * pfdp , size_t * npfdp , struct timespec * timeoutp , u_int maxfds )
20662068{
20672069 struct pollfd * pfd = * pfdp ;
20682070 size_t i , j , npfd = 0 ;
@@ -2128,14 +2130,8 @@ prepare_poll(struct pollfd **pfdp, size_t *npfdp, int *timeoutp, u_int maxfds)
21282130 if (parent_alive_interval != 0 )
21292131 deadline = (deadline == 0 ) ? parent_alive_interval :
21302132 MINIMUM (deadline , parent_alive_interval );
2131- if (deadline == 0 ) {
2132- * timeoutp = -1 ; /* INFTIM */
2133- } else {
2134- if (deadline > INT_MAX / 1000 )
2135- * timeoutp = INT_MAX / 1000 ;
2136- else
2137- * timeoutp = deadline * 1000 ;
2138- }
2133+ if (deadline != 0 )
2134+ ptimeout_deadline_sec (timeoutp , deadline );
21392135 return (1 );
21402136}
21412137
@@ -2155,17 +2151,16 @@ void
21552151cleanup_exit (int i )
21562152{
21572153 cleanup_socket ();
2154+ #ifdef ENABLE_PKCS11
2155+ pkcs11_terminate ();
2156+ #endif
21582157 _exit (i );
21592158}
21602159
21612160static void
21622161cleanup_handler (int sig )
21632162{
2164- cleanup_socket ();
2165- #ifdef ENABLE_PKCS11
2166- pkcs11_terminate ();
2167- #endif
2168- _exit (2 );
2163+ signalled = sig ;
21692164}
21702165
21712166static void
@@ -2209,10 +2204,11 @@ main(int ac, char **av)
22092204 char pidstrbuf [1 + 3 * sizeof pid ];
22102205 size_t len ;
22112206 mode_t prev_mask ;
2212- int timeout = -1 ; /* INFTIM */
2207+ struct timespec timeout ;
22132208 struct pollfd * pfd = NULL ;
22142209 size_t npfd = 0 ;
22152210 u_int maxfds ;
2211+ sigset_t nsigset , osigset ;
22162212
22172213 /* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */
22182214 sanitise_stdfd ();
@@ -2448,13 +2444,25 @@ main(int ac, char **av)
24482444 ssh_signal (SIGHUP , cleanup_handler );
24492445 ssh_signal (SIGTERM , cleanup_handler );
24502446
2447+ sigemptyset (& nsigset );
2448+ sigaddset (& nsigset , SIGINT );
2449+ sigaddset (& nsigset , SIGHUP );
2450+ sigaddset (& nsigset , SIGTERM );
2451+
24512452 if (pledge ("stdio rpath cpath unix id proc exec" , NULL ) == -1 )
24522453 fatal ("%s: pledge: %s" , __progname , strerror (errno ));
24532454 platform_pledge_agent ();
24542455
24552456 while (1 ) {
2457+ sigprocmask (SIG_BLOCK , & nsigset , & osigset );
2458+ if (signalled != 0 ) {
2459+ logit ("exiting on signal %d" , (int )signalled );
2460+ cleanup_exit (2 );
2461+ }
2462+ ptimeout_init (& timeout );
24562463 prepare_poll (& pfd , & npfd , & timeout , maxfds );
2457- result = poll (pfd , npfd , timeout );
2464+ result = ppoll (pfd , npfd , ptimeout_get_tsp (& timeout ), & osigset );
2465+ sigprocmask (SIG_SETMASK , & osigset , NULL );
24582466 saved_errno = errno ;
24592467 if (parent_alive_interval != 0 )
24602468 check_parent_exists ();
0 commit comments