Module Name: src
Committed By: riastradh
Date: Tue Mar 15 10:37:42 UTC 2022
Modified Files:
src/sys/kern: sys_descrip.c
Log Message:
posix_fadvise(2): Detect arithmetic overflow without UB.
Reported-by: [email protected]
To generate a diff of this commit:
cvs rdiff -u -r1.38 -r1.39 src/sys/kern/sys_descrip.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_descrip.c
diff -u src/sys/kern/sys_descrip.c:1.38 src/sys/kern/sys_descrip.c:1.39
--- src/sys/kern/sys_descrip.c:1.38 Sat Sep 11 10:09:13 2021
+++ src/sys/kern/sys_descrip.c Tue Mar 15 10:37:42 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: sys_descrip.c,v 1.38 2021/09/11 10:09:13 riastradh Exp $ */
+/* $NetBSD: sys_descrip.c,v 1.39 2022/03/15 10:37:42 riastradh Exp $ */
/*-
* Copyright (c) 2008, 2020 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_descrip.c,v 1.38 2021/09/11 10:09:13 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_descrip.c,v 1.39 2022/03/15 10:37:42 riastradh Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -672,6 +672,7 @@ sys_flock(struct lwp *l, const struct sy
int
do_posix_fadvise(int fd, off_t offset, off_t len, int advice)
{
+ const off_t OFF_MAX = __type_max(off_t);
file_t *fp;
vnode_t *vp;
off_t endoffset;
@@ -685,8 +686,8 @@ do_posix_fadvise(int fd, off_t offset, o
return EINVAL;
}
if (len == 0) {
- endoffset = INT64_MAX;
- } else if (len > 0 && (INT64_MAX - offset) >= len) {
+ endoffset = OFF_MAX;
+ } else if (len > 0 && (OFF_MAX - offset) >= len) {
endoffset = offset + len;
} else {
return EINVAL;
@@ -743,8 +744,8 @@ do_posix_fadvise(int fd, off_t offset, o
* region. It means that if the specified region is smaller
* than PAGE_SIZE, we do nothing.
*/
- if (round_page(offset) < trunc_page(endoffset) &&
- offset <= round_page(offset)) {
+ if (offset <= trunc_page(OFF_MAX) &&
+ round_page(offset) < trunc_page(endoffset)) {
rw_enter(vp->v_uobj.vmobjlock, RW_WRITER);
error = VOP_PUTPAGES(vp,
round_page(offset), trunc_page(endoffset),