Date: Wed, 05 Aug 2026 02:35:00 +0000 From: Alan Somers <asomers@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org Subject: git: 66c61a685c73 - stable/14 - Fix LOCAL_PEERCRED in 32-bit compat mode Message-ID: <6a72a154.3bfc9.3afb1532@gitrepo.freebsd.org>
index | next in thread | raw e-mail
The branch stable/14 has been updated by asomers: URL: https://cgit.FreeBSD.org/src/commit/?id=66c61a685c73aacf92aa0ecdadeff5f38332d669 commit 66c61a685c73aacf92aa0ecdadeff5f38332d669 Author: Alan Somers <asomers@FreeBSD.org> AuthorDate: 2026-04-27 23:46:53 +0000 Commit: Alan Somers <asomers@FreeBSD.org> CommitDate: 2026-08-05 02:23:12 +0000 Fix LOCAL_PEERCRED in 32-bit compat mode Previously the cr_pid field would be incorrectly copied to userland, due to a size mismatch between the structure as defined in 32-bit vs 64-bit builds. Fix it by converting the structure before copying it to userland. PR: 294833 Sponsored by: ConnectWise Reviewed by: emaste Differential Revision: https://reviews.freebsd.org/D56675 (cherry picked from commit 1d24638d3e8875e4b99a4b5e39f4241e37221b3d) linuxulator: fix SO_PEERCRED emulation after 1d24638d3e8 For Linux binaries, sopt->sopt_td may be null. And there's also no need to check it, since struct l_ucred has the same layout on 32-bit systems as on 64-bit ones. PR: 295333 Reported by: Miguel Gomes <miguel.dias.gomes@protonmail.com> Fixes: 1d24638d3e8 ("Fix LOCAL_PEERCRED in 32-bit compat mode") Reviewed by: emaste Differential Revision: https://reviews.freebsd.org/D57032 (cherry picked from commit 4cee16d471d47f4673e4d2c66f7a96d4e6d86ee9) --- sys/kern/uipc_usrreq.c | 23 +++++++++++++++++++++-- sys/sys/ucred.h | 11 +++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/sys/kern/uipc_usrreq.c b/sys/kern/uipc_usrreq.c index 4df36221bc6a..c78b63005ca5 100644 --- a/sys/kern/uipc_usrreq.c +++ b/sys/kern/uipc_usrreq.c @@ -84,6 +84,7 @@ #include <sys/socketvar.h> #include <sys/signalvar.h> #include <sys/stat.h> +#include <sys/sysent.h> #include <sys/sx.h> #include <sys/sysctl.h> #include <sys/systm.h> @@ -1785,8 +1786,26 @@ uipc_ctloutput(struct socket *so, struct sockopt *sopt) error = EINVAL; } UNP_PCB_UNLOCK(unp); - if (error == 0) - error = sooptcopyout(sopt, &xu, sizeof(xu)); + if (error != 0) + break; +#ifdef COMPAT_FREEBSD32 + if (sopt->sopt_td && + SV_PROC_FLAG(sopt->sopt_td->td_proc, SV_ILP32)) + { + struct xucred32 xu32 = {}; + int i; + + xu32.cr_version = xu.cr_version; + xu32.cr_uid = xu.cr_uid; + xu32.cr_ngroups = xu.cr_ngroups; + for (i = 0; i < XU_NGROUPS; i++) + xu32.cr_groups[i] = xu.cr_groups[i]; + xu32.cr_pid = xu.cr_pid; + error = sooptcopyout(sopt, &xu32, sizeof(xu32)); + break; + } +#endif + error = sooptcopyout(sopt, &xu, sizeof(xu)); break; case LOCAL_CREDS: diff --git a/sys/sys/ucred.h b/sys/sys/ucred.h index d8b999e27db7..da72901a5b63 100644 --- a/sys/sys/ucred.h +++ b/sys/sys/ucred.h @@ -183,6 +183,17 @@ struct setcred32 { uint32_t sc_label; /* struct mac32 [*] */ }; +#ifdef COMPAT_FREEBSD32 +/* 32-bit compatible version of xucred */ +struct xucred32 { + u_int cr_version; /* structure layout version */ + uid_t cr_uid; /* effective user id */ + short cr_ngroups; /* number of groups (incl. cr_gid). */ + gid_t cr_groups[XU_NGROUPS]; /* groups */ + pid_t cr_pid; +}; +#endif + struct thread; /* Common native and 32-bit compatibility entry point. */home | help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6a72a154.3bfc9.3afb1532>
