Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Sun, 27 Dec 2020 18:42:01 +0000
From: Alexander Lobakin <alobakin@...me>
To: Rich Felker <dalias@...ifal.cx>, musl@...ts.openwall.com
Cc: Alexander Lobakin <alobakin@...me>
Subject: [PATCH 11/18] pselect, select: prefer time64 variant of pselect6 if available

Instead of using time64 variant "only when needed", use it as
a default and fallback to time32 only on -ENOSYS.
Also use deprecated select only as a last chance.

Signed-off-by: Alexander Lobakin <alobakin@...me>
---
 src/select/pselect.c |  6 ++----
 src/select/select.c  | 22 ++++++++++++----------
 2 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/src/select/pselect.c b/src/select/pselect.c
index 54cfb291bba2..f68616a247de 100644
--- a/src/select/pselect.c
+++ b/src/select/pselect.c
@@ -13,10 +13,8 @@ int pselect(int n, fd_set *restrict rfds, fd_set *restrict wfds, fd_set *restric
 	time_t s = ts ? ts->tv_sec : 0;
 	long ns = ts ? ts->tv_nsec : 0;
 #ifdef SYS_pselect6_time64
-	int r = -ENOSYS;
-	if (SYS_pselect6 == SYS_pselect6_time64 || !IS32BIT(s))
-		r = __syscall_cp(SYS_pselect6_time64, n, rfds, wfds, efds,
-			ts ? ((long long[]){s, ns}) : 0, data);
+	int r = __syscall_cp(SYS_pselect6_time64, n, rfds, wfds, efds,
+		ts ? ((long long[]){s, ns}) : 0, data);
 	if (SYS_pselect6 == SYS_pselect6_time64 || r!=-ENOSYS)
 		return __syscall_ret(r);
 	s = CLAMP(s);
diff --git a/src/select/select.c b/src/select/select.c
index 8a7868840304..d2dbb7b08362 100644
--- a/src/select/select.c
+++ b/src/select/select.c
@@ -13,6 +13,7 @@ int select(int n, fd_set *restrict rfds, fd_set *restrict wfds, fd_set *restrict
 	suseconds_t us = tv ? tv->tv_usec : 0;
 	long ns;
 	const time_t max_time = (1ULL<<8*sizeof(time_t)-1)-1;
+	int r = -ENOSYS;
 
 	if (s<0 || us<0) return __syscall_ret(-EINVAL);
 	if (us/1000000 > max_time - s) {
@@ -26,19 +27,20 @@ int select(int n, fd_set *restrict rfds, fd_set *restrict wfds, fd_set *restrict
 	}
 
 #ifdef SYS_pselect6_time64
-	int r = -ENOSYS;
-	if (SYS_pselect6 == SYS_pselect6_time64 || !IS32BIT(s))
-		r = __syscall_cp(SYS_pselect6_time64, n, rfds, wfds, efds,
-			tv ? ((long long[]){s, ns}) : 0,
-			((syscall_arg_t[]){ 0, _NSIG/8 }));
+	r = __syscall_cp(SYS_pselect6_time64, n, rfds, wfds, efds,
+		tv ? ((long long[]){s, ns}) : 0,
+		((syscall_arg_t[]){ 0, _NSIG/8 }));
 	if (SYS_pselect6 == SYS_pselect6_time64 || r!=-ENOSYS)
 		return __syscall_ret(r);
 #endif
-#ifdef SYS_select
-	return syscall_cp(SYS_select, n, rfds, wfds, efds,
-		tv ? ((long[]){s, us}) : 0);
-#else
-	return syscall_cp(SYS_pselect6, n, rfds, wfds, efds,
+#ifdef SYS_pselect6
+	r = __syscall_cp(SYS_pselect6, n, rfds, wfds, efds,
 		tv ? ((long[]){s, ns}) : 0, ((syscall_arg_t[]){ 0, _NSIG/8 }));
 #endif
+#ifdef SYS_select
+	if (r == -ENOSYS)
+		r = __syscall_cp(SYS_select, n, rfds, wfds, efds,
+			tv ? ((long[]){s, us}) : 0);
+#endif
+	return __syscall_ret(r);
 }
-- 
2.29.2


Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.