The branch main has been updated by christos: URL: https://cgit.FreeBSD.org/src/commit/?id=b9c10eeb380b3ba629421062af8658e79a9171cd
commit b9c10eeb380b3ba629421062af8658e79a9171cd Author: Christos Margiolis <[email protected]> AuthorDate: 2026-05-15 14:07:59 +0000 Commit: Christos Margiolis <[email protected]> CommitDate: 2026-05-15 15:08:11 +0000 sound: Improve hw.snd.compat_linux_mmap - Reject PROT_EXEC in all cases when Linux support is not compiled in. - Define sysctl only when Linux support is compiled in. - Document better. Sponsored by: The FreeBSD Foundation MFC after: 1 week Reviewed by: emaste Pull Request: https://ron-dev.freebsd.org/FreeBSD/src/pulls/29 --- share/man/man4/pcm.4 | 26 +++++++++++++++++--------- sys/dev/sound/pcm/dsp.c | 13 +++++-------- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/share/man/man4/pcm.4 b/share/man/man4/pcm.4 index 518c37b54f1d..8a92cefa3549 100644 --- a/share/man/man4/pcm.4 +++ b/share/man/man4/pcm.4 @@ -23,7 +23,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd February 15, 2025 +.Dd May 15, 2026 .Dt SOUND 4 .Os .Sh NAME @@ -254,21 +254,29 @@ are global settings and are device specific. .Bl -tag -width indent .It Va hw.snd.compat_linux_mmap -Linux +This +.Xr sysctl 8 +variable is available only when Linux application support is compiled into the +kernel, and affects Linux binaries only. +It is a hack to get around the fact that, for i386 emulation, +.Xr linux 4 +historically set PROT_EXEC automatically when PROT_READ or PROT_WRITE was set +during an .Xr mmap 2 -compatibility. +call, which +.Fx +does not. +.Pp The following values are supported (default is 0): .Bl -tag -width 2n .It -1 -Force disabling/denying PROT_EXEC +Force-disable PROT_EXEC .Xr mmap 2 -requests. +requests, even for Linux applications. .It 0 -Auto detect proc/ABI type, allow +Allow PROT_EXEC .Xr mmap 2 -for Linux applications, and deny for everything else. -.It 1 -Always allow PROT_EXEC page mappings. +requests for Linux applications only. .El .It Va hw.snd.default_auto Automatically assign the default sound unit. diff --git a/sys/dev/sound/pcm/dsp.c b/sys/dev/sound/pcm/dsp.c index 7bc1decc283b..d9726ffdd6bb 100644 --- a/sys/dev/sound/pcm/dsp.c +++ b/sys/dev/sound/pcm/dsp.c @@ -54,10 +54,12 @@ struct dsp_cdevpriv { struct pcm_channel *wrch; }; +#ifdef SV_ABI_LINUX static int dsp_mmap_allow_prot_exec = 0; SYSCTL_INT(_hw_snd, OID_AUTO, compat_linux_mmap, CTLFLAG_RWTUN, &dsp_mmap_allow_prot_exec, 0, - "linux mmap compatibility (-1=force disable 0=auto 1=force enable)"); + "linux mmap compatibility (-1=force-disable 0=auto)"); +#endif static int dsp_basename_clone = 1; SYSCTL_INT(_hw_snd, OID_AUTO, basename_clone, CTLFLAG_RWTUN, @@ -1923,20 +1925,15 @@ dsp_mmap_single(struct cdev *i_dev, vm_ooffset_t *offset, struct pcm_channel *wrch, *rdch, *c; int err; +#ifdef SV_ABI_LINUX /* - * Reject PROT_EXEC by default. It just doesn't makes sense. - * Unfortunately, we have to give up this one due to linux_mmap - * changes. - * * https://lists.freebsd.org/pipermail/freebsd-emulation/2007-June/003698.html - * */ -#ifdef SV_ABI_LINUX if ((nprot & PROT_EXEC) && (dsp_mmap_allow_prot_exec < 0 || (dsp_mmap_allow_prot_exec == 0 && SV_CURPROC_ABI() != SV_ABI_LINUX))) #else - if ((nprot & PROT_EXEC) && dsp_mmap_allow_prot_exec < 1) + if (nprot & PROT_EXEC) #endif return (EINVAL);
