Skip to content

Commit a6a740a

Browse files
committed
upstream: avoid logging in signal handler by converting mainloop to
ppoll() bz3670, reported by Ben Hamilton; ok dtucker@ OpenBSD-Commit-ID: e58f18042b86425405ca09e6e9d7dfa1df9f5f7f
1 parent cd82f75 commit a6a740a

File tree

1 file changed

+25
-17
lines changed

1 file changed

+25
-17
lines changed

ssh-agent.c

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
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;
162162
pid_t parent_pid = -1;
163163
time_t parent_alive_interval = 0;
164164

165+
sig_atomic_t signalled = 0;
166+
165167
/* pid of process for which cleanup_socket is applicable */
166168
pid_t cleanup_pid = 0;
167169

@@ -2062,7 +2064,7 @@ after_poll(struct pollfd *pfd, size_t npfd, u_int maxfds)
20622064
}
20632065

20642066
static 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
21552151
cleanup_exit(int i)
21562152
{
21572153
cleanup_socket();
2154+
#ifdef ENABLE_PKCS11
2155+
pkcs11_terminate();
2156+
#endif
21582157
_exit(i);
21592158
}
21602159

21612160
static void
21622161
cleanup_handler(int sig)
21632162
{
2164-
cleanup_socket();
2165-
#ifdef ENABLE_PKCS11
2166-
pkcs11_terminate();
2167-
#endif
2168-
_exit(2);
2163+
signalled = sig;
21692164
}
21702165

21712166
static 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

Comments
 (0)