Use poll() in BIO_socket_wait() if available

Reviewed-by: Tom Cosgrove <tom.cosgrove@arm.com>
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/25055)
This commit is contained in:
Andreas Mair 2024-07-31 13:59:45 +02:00 committed by Matt Caswell
parent 99548cd16e
commit 38e8392ba0
2 changed files with 22 additions and 3 deletions

View File

@ -430,15 +430,16 @@ int BIO_sock_info(int sock,
*/ */
int BIO_socket_wait(int fd, int for_read, time_t max_time) int BIO_socket_wait(int fd, int for_read, time_t max_time)
{ {
# if defined(OPENSSL_SYS_WINDOWS) || !defined(POLLIN)
fd_set confds; fd_set confds;
struct timeval tv; struct timeval tv;
time_t now; time_t now;
#ifdef _WIN32 # ifdef _WIN32
if ((SOCKET)fd == INVALID_SOCKET) if ((SOCKET)fd == INVALID_SOCKET)
#else # else
if (fd < 0 || fd >= FD_SETSIZE) if (fd < 0 || fd >= FD_SETSIZE)
#endif # endif
return -1; return -1;
if (max_time == 0) if (max_time == 0)
return 1; return 1;
@ -453,5 +454,22 @@ int BIO_socket_wait(int fd, int for_read, time_t max_time)
tv.tv_sec = (long)(max_time - now); /* might overflow */ tv.tv_sec = (long)(max_time - now); /* might overflow */
return select(fd + 1, for_read ? &confds : NULL, return select(fd + 1, for_read ? &confds : NULL,
for_read ? NULL : &confds, NULL, &tv); for_read ? NULL : &confds, NULL, &tv);
# else
struct pollfd confds;
time_t now;
if (fd < 0)
return -1;
if (max_time == 0)
return 1;
now = time(NULL);
if (max_time < now)
return 0;
confds.fd = fd;
confds.events = for_read ? POLLIN : POLLOUT;
return poll(&confds, 1, (int)(max_time - now) * 1000);
# endif
} }
#endif /* !defined(OPENSSL_NO_SOCK) */ #endif /* !defined(OPENSSL_NO_SOCK) */

View File

@ -97,6 +97,7 @@ typedef size_t socklen_t; /* Currently appears to be missing on VMS */
# include <in.h> # include <in.h>
# include <inet.h> # include <inet.h>
# else # else
# include <poll.h>
# include <sys/socket.h> # include <sys/socket.h>
# if !defined(NO_SYS_UN_H) && defined(AF_UNIX) && !defined(OPENSSL_NO_UNIX_SOCK) # if !defined(NO_SYS_UN_H) && defined(AF_UNIX) && !defined(OPENSSL_NO_UNIX_SOCK)
# include <sys/un.h> # include <sys/un.h>