git: 21fe39288f8c - releng/15.0 - posixshm: Disallow fspacectl() on largepage objects
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 30 Jun 2026 17:21:29 UTC
The branch releng/15.0 has been updated by markj:
URL: https://cgit.FreeBSD.org/src/commit/?id=21fe39288f8cf792a4c2589c99f4a0afe55f47a6
commit 21fe39288f8cf792a4c2589c99f4a0afe55f47a6
Author: Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2026-06-24 19:56:07 +0000
Commit: Mark Johnston <markj@FreeBSD.org>
CommitDate: 2026-06-30 02:32:57 +0000
posixshm: Disallow fspacectl() on largepage objects
As with truncation, the operation isn't supported, but nothing prevented
it.
Add a regression test.
Approved by: so
Security: FreeBSD-SA-26:44.posixshm
Security: CVE-2026-49428
Reported by: Chris Jarrett-Davies <chrisjd@openai.com>
Reviewed by: kib
Sponsored by: The FreeBSD Foundation
Differential Revision: https://reviews.freebsd.org/D57830
---
sys/kern/uipc_shm.c | 5 ++++-
tests/sys/posixshm/posixshm_test.c | 22 ++++++++++++++++++++++
2 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/sys/kern/uipc_shm.c b/sys/kern/uipc_shm.c
index eb1327f7f2de..136bb03246f8 100644
--- a/sys/kern/uipc_shm.c
+++ b/sys/kern/uipc_shm.c
@@ -2090,11 +2090,14 @@ shm_fspacectl(struct file *fp, int cmd, off_t *offset, off_t *length, int flags,
("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 (shm_largepage(shmfd))
+ return (ENOTSUP);
+
rl_cookie = shm_rangelock_wlock(shmfd, off, off + len);
switch (cmd) {
case SPACECTL_DEALLOC:
diff --git a/tests/sys/posixshm/posixshm_test.c b/tests/sys/posixshm/posixshm_test.c
index 1250fcb63a93..d53e8f57b89e 100644
--- a/tests/sys/posixshm/posixshm_test.c
+++ b/tests/sys/posixshm/posixshm_test.c
@@ -1379,6 +1379,27 @@ ATF_TC_BODY(largepage_config, tc)
ATF_REQUIRE(close(fd) == 0);
}
+ATF_TC_WITHOUT_HEAD(largepage_fspacectl);
+ATF_TC_BODY(largepage_fspacectl, tc)
+{
+ struct spacectl_range range;
+ size_t ps[MAXPAGESIZES];
+ int fd, pscnt;
+
+ pscnt = pagesizes(ps);
+
+ for (int i = 1; i < pscnt; i++) {
+ fd = shm_open_large(i, SHM_LARGEPAGE_ALLOC_DEFAULT, ps[i]);
+
+ range.r_offset = 0;
+ range.r_len = ps[i];
+ ATF_REQUIRE_ERRNO(ENOTSUP,
+ fspacectl(fd, SPACECTL_DEALLOC, &range, 0, &range) == -1);
+
+ ATF_REQUIRE(close(fd) == 0);
+ }
+}
+
ATF_TC_WITHOUT_HEAD(largepage_mmap);
ATF_TC_BODY(largepage_mmap, tc)
{
@@ -2167,6 +2188,7 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, mmap_prot);
ATF_TP_ADD_TC(tp, largepage_basic);
ATF_TP_ADD_TC(tp, largepage_config);
+ ATF_TP_ADD_TC(tp, largepage_fspacectl);
ATF_TP_ADD_TC(tp, largepage_mmap);
ATF_TP_ADD_TC(tp, largepage_munmap);
ATF_TP_ADD_TC(tp, largepage_madvise);