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)
{
# if defined(OPENSSL_SYS_WINDOWS) || !defined(POLLIN)
fd_set confds;
struct timeval tv;
time_t now;
#ifdef _WIN32
# ifdef _WIN32
if ((SOCKET)fd == INVALID_SOCKET)
#else
# else
if (fd < 0 || fd >= FD_SETSIZE)
#endif
# endif
return -1;
if (max_time == 0)
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 */
return select(fd + 1, for_read ? &confds : NULL,
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) */

View File

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