From nobody Fri Nov 15 10:48:56 2024 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4XqYff43wnz5cygq; Fri, 15 Nov 2024 10:48:58 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4XqYfc6BTtz4WYs; Fri, 15 Nov 2024 10:48:56 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1731667736; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=/X1gWd9dj90hbnmFheO5gKJaWntPkTUM1f55aqlurWc=; b=xZf5I022kvk+3yCIHurxeMs3UAYmDoutJUyxgzH2sZyjOQbaYo8ncek4F34y+5PlXoryZx 1pTpzcWExiVBN47zq9TX6ep9+QV6XwegHwqY1lp4rbE1B2fcnU+ffdQ4I+mYD3dlcCBsbr WEwkdkVYXwi11FVnx8RVn0WeDt2DXm+ViWIBeoDdG3BALV+7cWkewiHfxz1nMZ1dZiIlxp kXzIukZH7DBoQibIVtTQAs32qKvhMuGgbpefg4jom8I8YH8EfXWHfx73xTvD1Knb27gqff oFhjvWbhEmZ0PFS64peAe96c/Cnzf0UhNDXlgd5D3Gq2SXz0soIOoPD/o0fwGg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1731667736; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=/X1gWd9dj90hbnmFheO5gKJaWntPkTUM1f55aqlurWc=; b=Ynvxgwm/lhRa7UN9RUBGQepz2JBOKoAIlzOSAJHx0VKaVfVzURzGMhtRJgzKWiuy++d919 6nE5EUcpid/K5H0e70i35JO9okdVbak/S4p991Q0LTSebRVsOwaAFOb1K6T+/1+HaTMbhk ZaRFNh0muoXJFqqgbXQDyfxYgTwkaQIP7cemNRW5IjLzQd6J4dvE0XVszo9wo0dBdrzH8L nNrf3opYlOuMg+QvFJVqBCWE5dtRHPIwnUX1zBnDMekXczzhQ9HIQv5w5krkdQx9JITBmg aCDBXBx9b56kAtL4i9xwnGe3juO0yfqvoCHwQGP4KENwJjNpSq7UipukULUi3w== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1731667736; a=rsa-sha256; cv=none; b=qJ52WFhLj5CMnrG+V69vWi693Nil3w829js0OXhI8/ZhBxCWoCPylOfzQX7GVwvk9lpDx8 gmF2LZcCjng2xZILcr49bE8OyVCzVQbxfZM23osZH26K4QFW1aDDZi+BB6YQXvInvoaBaM 63zrL2lJe1sYTadfko8BuzPJ4gbtMfY3TXBHOPITvQk0/Ojxc3QuVYKOh26mNhGcT3F05v qAJJgUL0W9DpxJ10THaq2SUcfksEwf5PErwboez47MYeJwAr+zpKPwiRUOK1iiVdaGoA/U WUSljTkZGwnWjRl5Fsm2jG9um1A52/HeJkaiS/yr14J6yNunrjx982zSCaWhWA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4XqYfc5XgTzKSd; Fri, 15 Nov 2024 10:48:56 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 4AFAmuJw017898; Fri, 15 Nov 2024 10:48:56 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 4AFAmuHm017895; Fri, 15 Nov 2024 10:48:56 GMT (envelope-from git) Date: Fri, 15 Nov 2024 10:48:56 GMT Message-Id: <202411151048.4AFAmuHm017895@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Olivier Certner Subject: git: 5d10a05c6dfa - stable/14 - cred: kern_setgroups(): Internally use int as number of groups' type List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: olce X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: 5d10a05c6dfacd30a2691e92eb68cfabb6e94104 Auto-Submitted: auto-generated The branch stable/14 has been updated by olce: URL: https://cgit.FreeBSD.org/src/commit/?id=5d10a05c6dfacd30a2691e92eb68cfabb6e94104 commit 5d10a05c6dfacd30a2691e92eb68cfabb6e94104 Author: Olivier Certner AuthorDate: 2024-10-01 16:46:46 +0000 Commit: Olivier Certner CommitDate: 2024-11-15 10:47:41 +0000 cred: kern_setgroups(): Internally use int as number of groups' type sys_setgroups() (and sys_getgroups()) was changed in commit "kern: fail getgroup and setgroup with negative int" (4bc2174a1b48) to take the number of groups as an 'int' (for sys_getgroups(), POSIX mandates this change; for sys_setgroups(), which it does not standardize, it's arguably for consistency). All our internal APIs related to groups on 'struct ucred', as well as related members on the latter, treat that number as an 'int' as well (and not a 'u_int'). Consequently, to avoid surprises, change kern_setgroups() to behave the same, and fix audit_arg_groupset() accordingly. With that change, everything is handled with signed integers internally. Update sanity checks accordingly. Reviewed by: mhorne Approved by: markj (mentor) MFC after: 3 days Differential Revision: https://reviews.freebsd.org/D46912 (cherry picked from commit abd39811cd7e4bb928da503f4a5c79364ac8d0f5) Approved by: markj (mentor) --- sys/kern/kern_prot.c | 16 ++++++++++++++-- sys/security/audit/audit.h | 2 +- sys/security/audit/audit_arg.c | 8 ++++---- sys/sys/syscallsubr.h | 2 +- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/sys/kern/kern_prot.c b/sys/kern/kern_prot.c index dc2ab35dc5df..3052dc44d828 100644 --- a/sys/kern/kern_prot.c +++ b/sys/kern/kern_prot.c @@ -815,6 +815,15 @@ sys_setgroups(struct thread *td, struct setgroups_args *uap) gid_t *groups; int gidsetsize, error; + /* + * Sanity check size now to avoid passing too big a value to copyin(), + * even if kern_setgroups() will do it again. + * + * Ideally, the 'gidsetsize' argument should have been a 'u_int' (and it + * was, in this implementation, for a long time), but POSIX standardized + * getgroups() to take an 'int' and it would be quite entrapping to have + * setgroups() differ. + */ gidsetsize = uap->gidsetsize; if (gidsetsize > ngroups_max + 1 || gidsetsize < 0) return (EINVAL); @@ -843,13 +852,16 @@ gidp_cmp(const void *p1, const void *p2) } int -kern_setgroups(struct thread *td, u_int ngrp, gid_t *groups) +kern_setgroups(struct thread *td, int ngrp, gid_t *groups) { struct proc *p = td->td_proc; struct ucred *newcred, *oldcred; int error; - MPASS(ngrp <= ngroups_max + 1); + /* Sanity check size. */ + if (ngrp < 0 || ngrp > ngroups_max + 1) + return (EINVAL); + AUDIT_ARG_GROUPSET(groups, ngrp); newcred = crget(); crextend(newcred, ngrp); diff --git a/sys/security/audit/audit.h b/sys/security/audit/audit.h index e7a9c83afbb3..b87dd52e0773 100644 --- a/sys/security/audit/audit.h +++ b/sys/security/audit/audit.h @@ -98,7 +98,7 @@ void audit_arg_rgid(gid_t rgid); void audit_arg_ruid(uid_t ruid); void audit_arg_sgid(gid_t sgid); void audit_arg_suid(uid_t suid); -void audit_arg_groupset(gid_t *gidset, u_int gidset_size); +void audit_arg_groupset(gid_t *gidset, int gidset_size); void audit_arg_login(char *login); void audit_arg_ctlname(int *name, int namelen); void audit_arg_mask(int mask); diff --git a/sys/security/audit/audit_arg.c b/sys/security/audit/audit_arg.c index 7b7fe34ccda9..db621db1574f 100644 --- a/sys/security/audit/audit_arg.c +++ b/sys/security/audit/audit_arg.c @@ -264,13 +264,13 @@ audit_arg_suid(uid_t suid) } void -audit_arg_groupset(gid_t *gidset, u_int gidset_size) +audit_arg_groupset(gid_t *gidset, int gidset_size) { - u_int i; + int i; struct kaudit_record *ar; - KASSERT(gidset_size <= ngroups_max + 1, - ("audit_arg_groupset: gidset_size > (kern.ngroups + 1)")); + KASSERT(gidset_size >= 0 && gidset_size <= ngroups_max + 1, + ("audit_arg_groupset: gidset_size < 0 or > (kern.ngroups + 1)")); ar = currecord(); if (ar == NULL) diff --git a/sys/sys/syscallsubr.h b/sys/sys/syscallsubr.h index 87e29f5ca5fc..1b34a3db8223 100644 --- a/sys/sys/syscallsubr.h +++ b/sys/sys/syscallsubr.h @@ -312,7 +312,7 @@ int kern_select(struct thread *td, int nd, fd_set *fd_in, fd_set *fd_ou, fd_set *fd_ex, struct timeval *tvp, int abi_nfdbits); int kern_sendit(struct thread *td, int s, struct msghdr *mp, int flags, struct mbuf *control, enum uio_seg segflg); -int kern_setgroups(struct thread *td, u_int ngrp, gid_t *groups); +int kern_setgroups(struct thread *td, int ngrp, gid_t *groups); int kern_setitimer(struct thread *, u_int, struct itimerval *, struct itimerval *); int kern_setpriority(struct thread *td, int which, int who, int prio);