aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKa Ho Ng <khng@FreeBSD.org>2022-07-23 19:14:45 +0000
committerKa Ho Ng <khng@FreeBSD.org>2022-07-23 19:16:23 +0000
commit8c9aa94b42bfe58f46be862ad5a08a68d9a19a4a (patch)
treedbe4899527b71b367ed2ff948fc23af995a88ae1
parent151abc80cde778bc18b91c334d07fbd52bbb38fb (diff)
downloadsrc-8c9aa94b42bfe58f46be862ad5a08a68d9a19a4a.tar.gz
src-8c9aa94b42bfe58f46be862ad5a08a68d9a19a4a.zip
Convert runtime param checks to KASSERTs for fo_fspacectl
Reviewed by: markj Differential Revision: https://reviews.freebsd.org/D35880
-rw-r--r--sys/kern/uipc_shm.c10
-rw-r--r--sys/kern/vfs_vnops.c8
2 files changed, 10 insertions, 8 deletions
diff --git a/sys/kern/uipc_shm.c b/sys/kern/uipc_shm.c
index 1ca088edfd78..0af2b22866f4 100644
--- a/sys/kern/uipc_shm.c
+++ b/sys/kern/uipc_shm.c
@@ -1990,16 +1990,16 @@ shm_fspacectl(struct file *fp, int cmd, off_t *offset, off_t *length, int flags,
off_t off, len;
int error;
- /* This assumes that the caller already checked for overflow. */
+ KASSERT(cmd == SPACECTL_DEALLOC, ("shm_fspacectl: Invalid cmd"));
+ KASSERT((flags & ~SPACECTL_F_SUPPORTED) == 0,
+ ("shm_fspacectl: non-zero flags"));
+ KASSERT(*offset >= 0 && *length > 0 && *length <= OFF_MAX - *offset,
+ ("shm_fspacectl: offset/length overflow or underflow"));
error = EINVAL;
shmfd = fp->f_data;
off = *offset;
len = *length;
- if (cmd != SPACECTL_DEALLOC || off < 0 || len <= 0 ||
- len > OFF_MAX - off || flags != 0)
- return (EINVAL);
-
rl_cookie = rangelock_wlock(&shmfd->shm_rl, off, off + len,
&shmfd->shm_mtx);
switch (cmd) {
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
index d5234b44e5eb..29851dcfaaa2 100644
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -3607,11 +3607,13 @@ vn_fspacectl(struct file *fp, int cmd, off_t *offset, off_t *length, int flags,
struct vnode *vp;
int ioflag;
+ KASSERT(cmd == SPACECTL_DEALLOC, ("vn_fspacectl: Invalid cmd"));
+ KASSERT((flags & ~SPACECTL_F_SUPPORTED) == 0,
+ ("vn_fspacectl: non-zero flags"));
+ KASSERT(*offset >= 0 && *length > 0 && *length <= OFF_MAX - *offset,
+ ("vn_fspacectl: offset/length overflow or underflow"));
vp = fp->f_vnode;
- if (cmd != SPACECTL_DEALLOC || *offset < 0 || *length <= 0 ||
- *length > OFF_MAX - *offset || flags != 0)
- return (EINVAL);
if (vp->v_type != VREG)
return (ENODEV);