diff options
Diffstat (limited to 'sbin')
-rw-r--r-- | sbin/iked/pfkey.c | 25 | ||||
-rw-r--r-- | sbin/isakmpd/pf_key_v2.c | 30 |
2 files changed, 17 insertions, 38 deletions
diff --git a/sbin/iked/pfkey.c b/sbin/iked/pfkey.c index 5bf0c0985f5..2b826957436 100644 --- a/sbin/iked/pfkey.c +++ b/sbin/iked/pfkey.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pfkey.c,v 1.39 2014/10/18 03:11:54 doug Exp $ */ +/* $OpenBSD: pfkey.c,v 1.40 2014/10/29 06:26:39 deraadt Exp $ */ /* * Copyright (c) 2010-2013 Reyk Floeter <reyk@openbsd.org> @@ -31,6 +31,7 @@ #include <err.h> #include <errno.h> #include <stdio.h> +#include <poll.h> #include <string.h> #include <stdlib.h> #include <unistd.h> @@ -1097,12 +1098,14 @@ pfkey_reply(int sd, u_int8_t **datap, ssize_t *lenp) { struct pfkey_message *pm; struct sadb_msg hdr; - struct timeval tv; ssize_t len; u_int8_t *data; - fd_set *fds; + struct pollfd pfd[1]; int n; + pfd[0].fd = sd; + pfd[0].events = POLLIN; + for (;;) { /* * We should actually expect the reply to get lost @@ -1111,21 +1114,9 @@ pfkey_reply(int sd, u_int8_t **datap, ssize_t *lenp) * and if it is not readable in that time, we fail * the read. */ - n = howmany(sd + 1, NFDBITS); - if ((fds = calloc(n, sizeof(fd_mask))) == NULL) { - log_warn("%s: calloc(%lu, %lu) failed", __func__, - (unsigned long) n, - (unsigned long) sizeof(fd_mask)); - return (-1); - } - FD_SET(sd, fds); - tv.tv_sec = 0; - tv.tv_usec = PFKEY_REPLY_TIMEOUT; - n = select(sd + 1, fds, 0, 0, &tv); - free(fds); + n = poll(pfd, 1, PFKEY_REPLY_TIMEOUT / 1000); if (n == -1) { - log_warn("%s: select(%d, fds, 0, 0, &tv) failed", - __func__, sd + 1); + log_warn("%s: poll() failed", __func__); return (-1); } if (n == 0) { diff --git a/sbin/isakmpd/pf_key_v2.c b/sbin/isakmpd/pf_key_v2.c index 782a4d02821..bb2a7ac4fe8 100644 --- a/sbin/isakmpd/pf_key_v2.c +++ b/sbin/isakmpd/pf_key_v2.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pf_key_v2.c,v 1.190 2014/10/22 16:35:34 millert Exp $ */ +/* $OpenBSD: pf_key_v2.c,v 1.191 2014/10/29 06:26:40 deraadt Exp $ */ /* $EOM: pf_key_v2.c,v 1.79 2000/12/12 00:33:19 niklas Exp $ */ /* @@ -43,6 +43,7 @@ #include <netinet/ip_ipsp.h> #include <arpa/inet.h> #include <stdlib.h> +#include <poll.h> #include <string.h> #include <unistd.h> #include <pwd.h> @@ -203,8 +204,11 @@ pf_key_v2_read(u_int32_t seq) struct sadb_msg *msg; struct sadb_msg hdr; struct sadb_ext *ext; - struct timeval tv; - fd_set *fds; + struct timeval tv; + struct pollfd pfd[1]; + + pfd[0].fd = pf_key_v2_socket; + pfd[0].events = POLLIN; while (1) { /* @@ -214,25 +218,9 @@ pf_key_v2_read(u_int32_t seq) * and if it is not readable in that time, we fail the read. */ if (seq) { - fds = calloc(howmany(pf_key_v2_socket + 1, NFDBITS), - sizeof(fd_mask)); - if (!fds) { - log_error("pf_key_v2_read: " - "calloc (%lu, %lu) failed", - (unsigned long) howmany(pf_key_v2_socket + 1, - NFDBITS), - (unsigned long) sizeof(fd_mask)); - goto cleanup; - } - FD_SET(pf_key_v2_socket, fds); - tv.tv_sec = 0; - tv.tv_usec = PF_KEY_REPLY_TIMEOUT; - n = select(pf_key_v2_socket + 1, fds, 0, 0, &tv); - free(fds); + n = poll(pfd, 1, PF_KEY_REPLY_TIMEOUT / 1000); if (n == -1) { - log_error("pf_key_v2_read: " - "select (%d, fds, 0, 0, &tv) failed", - pf_key_v2_socket + 1); + log_error("pf_key_v2_read: poll() failed"); goto cleanup; } if (!n) { |