Module Name: src Committed By: riastradh Date: Thu Dec 19 23:45:39 UTC 2024
Modified Files: src/sys/kern: sys_timerfd.c src/tests/lib/libc/sys: t_timerfd.c Log Message: timerfd_settime(2): Sanitize inputs like timer_settime(2). PR kern/58914: timerfd_settime(2) is missing itimespecfix To generate a diff of this commit: cvs rdiff -u -r1.9 -r1.10 src/sys/kern/sys_timerfd.c cvs rdiff -u -r1.9 -r1.10 src/tests/lib/libc/sys/t_timerfd.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/sys_timerfd.c diff -u src/sys/kern/sys_timerfd.c:1.9 src/sys/kern/sys_timerfd.c:1.10 --- src/sys/kern/sys_timerfd.c:1.9 Wed Dec 18 16:01:28 2024 +++ src/sys/kern/sys_timerfd.c Thu Dec 19 23:45:39 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: sys_timerfd.c,v 1.9 2024/12/18 16:01:28 riastradh Exp $ */ +/* $NetBSD: sys_timerfd.c,v 1.10 2024/12/19 23:45:39 riastradh Exp $ */ /*- * Copyright (c) 2020 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sys_timerfd.c,v 1.9 2024/12/18 16:01:28 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_timerfd.c,v 1.10 2024/12/19 23:45:39 riastradh Exp $"); /* * timerfd @@ -593,12 +593,17 @@ do_timerfd_settime(struct lwp *l, int fd const struct itimerspec *new_value, struct itimerspec *old_value, register_t *retval) { + struct itimerspec value = *new_value; file_t *fp; int error; if (flags & ~(TFD_TIMER_ABSTIME | TFD_TIMER_CANCEL_ON_SET)) { return EINVAL; } + if (itimespecfix(&value.it_value) != 0 || + itimespecfix(&value.it_interval) != 0) { + return EINVAL; + } if ((fp = fd_getfile(fd)) == NULL) { return EBADF; @@ -618,7 +623,7 @@ do_timerfd_settime(struct lwp *l, int fd if (old_value != NULL) { *old_value = it->it_time; } - it->it_time = *new_value; + it->it_time = value; /* * If we've been passed a relative value, convert it to an Index: src/tests/lib/libc/sys/t_timerfd.c diff -u src/tests/lib/libc/sys/t_timerfd.c:1.9 src/tests/lib/libc/sys/t_timerfd.c:1.10 --- src/tests/lib/libc/sys/t_timerfd.c:1.9 Thu Dec 19 20:11:03 2024 +++ src/tests/lib/libc/sys/t_timerfd.c Thu Dec 19 23:45:39 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: t_timerfd.c,v 1.9 2024/12/19 20:11:03 riastradh Exp $ */ +/* $NetBSD: t_timerfd.c,v 1.10 2024/12/19 23:45:39 riastradh Exp $ */ /*- * Copyright (c) 2020 The NetBSD Foundation, Inc. @@ -29,7 +29,7 @@ #include <sys/cdefs.h> __COPYRIGHT("@(#) Copyright (c) 2020\ The NetBSD Foundation, inc. All rights reserved."); -__RCSID("$NetBSD: t_timerfd.c,v 1.9 2024/12/19 20:11:03 riastradh Exp $"); +__RCSID("$NetBSD: t_timerfd.c,v 1.10 2024/12/19 23:45:39 riastradh Exp $"); #include <sys/types.h> @@ -216,19 +216,9 @@ ATF_TC_BODY(timerfd_invalidtime, tc) RL(clock_gettime(CLOCK_MONOTONIC, &now)); RL(fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK)); - atf_tc_expect_fail("PR kern/58914:" - " timerfd_settime(2) is missing itimespecfix"); for (i = 0; i < __arraycount(einval_its); i++) { struct itimerspec its; - if (einval_its[i].it_interval.tv_sec < 0 || - einval_its[i].it_interval.tv_nsec < 0 || - einval_its[i].it_interval.tv_nsec >= 1000000000) { - /* Avoid crashing the kernel for now, PR 58914. */ - fprintf(stderr, "skip %u\n", i); - continue; - } - fprintf(stderr, "case %u\n", i); ATF_CHECK_ERRNO(EINVAL,