aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorChristos Margiolis <christos@FreeBSD.org>2026-05-27 15:50:33 +0000
committerMark Johnston <markj@FreeBSD.org>2026-06-08 15:39:32 +0000
commitc42ee04c521ed8268421173f961859233a321b17 (patch)
tree57e5bf8302c31388a8cfe1b0b65f57dbce342608 /tests
parent540a315cdb46d6aa3cdbb3797710db652b3c4f4a (diff)
sound: Check for offset overflow in dsp_mmap_single()
Approved by: so Security: FreeBSD-SA-26:27.sound Security: CVE-2026-45258 Reviewed by: markj Sponsored by: The FreeBSD Foundation
Diffstat (limited to 'tests')
-rw-r--r--tests/sys/sound/Makefile1
-rw-r--r--tests/sys/sound/mmap.c51
2 files changed, 52 insertions, 0 deletions
diff --git a/tests/sys/sound/Makefile b/tests/sys/sound/Makefile
index 74a0765a0540..ce156ae8c4cf 100644
--- a/tests/sys/sound/Makefile
+++ b/tests/sys/sound/Makefile
@@ -2,6 +2,7 @@ PACKAGE= tests
TESTSDIR= ${TESTSBASE}/sys/sound
+ATF_TESTS_C+= mmap
ATF_TESTS_C+= pcm_read_write
ATF_TESTS_C+= sndstat
diff --git a/tests/sys/sound/mmap.c b/tests/sys/sound/mmap.c
new file mode 100644
index 000000000000..ab203a39194c
--- /dev/null
+++ b/tests/sys/sound/mmap.c
@@ -0,0 +1,51 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2026 The FreeBSD Foundation
+ */
+
+#include <sys/mman.h>
+#include <sys/soundcard.h>
+
+#include <atf-c.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#define FMT_ERR(s) s ": %s", strerror(errno)
+
+ATF_TC(mmap_offset_overflow);
+ATF_TC_HEAD(mmap_offset_overflow, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "mmap offset overflow test");
+ atf_tc_set_md_var(tc, "require.kmods", "snd_dummy");
+}
+
+ATF_TC_BODY(mmap_offset_overflow, tc)
+{
+ uint8_t *buf;
+ off_t off;
+ size_t len;
+ int fd;
+
+ fd = open("/dev/dsp0", O_RDWR);
+ ATF_REQUIRE_MSG(fd >= 0, FMT_ERR("open"));
+
+ /* off + len will overflow and wrap back to 0. */
+ off = 0xfffffffffffff000;
+ len = 0x1000;
+
+ buf = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, off);
+ ATF_REQUIRE_MSG(buf == MAP_FAILED, FMT_ERR("mmap"));
+
+ munmap(buf, len);
+
+ close(fd);
+}
+
+ATF_TP_ADD_TCS(tp)
+{
+ ATF_TP_ADD_TC(tp, mmap_offset_overflow);
+
+ return (atf_no_error());
+}