fs/select.c | 12 ++++-------- include/linux/restart_block.h | 4 ++-- 2 files changed, 6 insertions(+), 10 deletions(-)
Storing the end time seconds as 'unsigned long' can lead to truncation
on 32-bit architectures if assigned from the 64-bit timespec64::tv_sec.
As the select() core uses timespec64 consistently, also use that in the
restart block.
This also allows the simplification of the accessors.
Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
Reviewed-by: Jan Kara <jack@suse.cz>
---
Changes in v2:
- Drop already applied patches, and trim recipients accordingly
- Pick up review tags
- Link to v1: https://lore.kernel.org/r/20251110-restart-block-expiration-v1-0-5d39cc93df4f@linutronix.de
---
fs/select.c | 12 ++++--------
include/linux/restart_block.h | 4 ++--
2 files changed, 6 insertions(+), 10 deletions(-)
diff --git a/fs/select.c b/fs/select.c
index 65019b8ba3f7..78a1508c84d3 100644
--- a/fs/select.c
+++ b/fs/select.c
@@ -1038,14 +1038,11 @@ static long do_restart_poll(struct restart_block *restart_block)
{
struct pollfd __user *ufds = restart_block->poll.ufds;
int nfds = restart_block->poll.nfds;
- struct timespec64 *to = NULL, end_time;
+ struct timespec64 *to = NULL;
int ret;
- if (restart_block->poll.has_timeout) {
- end_time.tv_sec = restart_block->poll.tv_sec;
- end_time.tv_nsec = restart_block->poll.tv_nsec;
- to = &end_time;
- }
+ if (restart_block->poll.has_timeout)
+ to = &restart_block->poll.end_time;
ret = do_sys_poll(ufds, nfds, to);
@@ -1077,8 +1074,7 @@ SYSCALL_DEFINE3(poll, struct pollfd __user *, ufds, unsigned int, nfds,
restart_block->poll.nfds = nfds;
if (timeout_msecs >= 0) {
- restart_block->poll.tv_sec = end_time.tv_sec;
- restart_block->poll.tv_nsec = end_time.tv_nsec;
+ restart_block->poll.end_time = end_time;
restart_block->poll.has_timeout = 1;
} else
restart_block->poll.has_timeout = 0;
diff --git a/include/linux/restart_block.h b/include/linux/restart_block.h
index 67d2bf579942..9b262109726d 100644
--- a/include/linux/restart_block.h
+++ b/include/linux/restart_block.h
@@ -6,6 +6,7 @@
#define __LINUX_RESTART_BLOCK_H
#include <linux/compiler.h>
+#include <linux/time64.h>
#include <linux/types.h>
struct __kernel_timespec;
@@ -50,8 +51,7 @@ struct restart_block {
struct pollfd __user *ufds;
int nfds;
int has_timeout;
- unsigned long tv_sec;
- unsigned long tv_nsec;
+ struct timespec64 end_time;
} poll;
};
};
---
base-commit: 8f0b4cce4481fb22653697cced8d0d04027cb1e8
change-id: 20251107-restart-block-expiration-52915454d881
Best regards,
--
Thomas Weißschuh <thomas.weissschuh@linutronix.de>
On Tue, 23 Dec 2025 08:00:39 +0100, Thomas Weißschuh wrote:
> Storing the end time seconds as 'unsigned long' can lead to truncation
> on 32-bit architectures if assigned from the 64-bit timespec64::tv_sec.
> As the select() core uses timespec64 consistently, also use that in the
> restart block.
>
> This also allows the simplification of the accessors.
>
> [...]
Applied to the vfs-7.0.misc branch of the vfs/vfs.git tree.
Patches in the vfs-7.0.misc branch should appear in linux-next soon.
Please report any outstanding bugs that were missed during review in a
new review to the original patch series allowing us to drop it.
It's encouraged to provide Acked-bys and Reviewed-bys even though the
patch has now been applied. If possible patch trailers will be updated.
Note that commit hashes shown below are subject to change due to rebase,
trailer updates or similar. If in doubt, please check the listed branch.
tree: https://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs.git
branch: vfs-7.0.misc
[1/1] select: store end_time as timespec64 in restart block
https://git.kernel.org/vfs/vfs/c/0f166bf1d6d8
© 2016 - 2026 Red Hat, Inc.