From nobody Thu Nov 10 19:15:13 2022 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 4N7WkT43DRz4dnwP; Thu, 10 Nov 2022 19:15:13 +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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4N7WkT3X9Vz41KV; Thu, 10 Nov 2022 19:15:13 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1668107713; 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=AfHHQn8/sS9rEmHxq46obwFNRUuZcaTyNwNeYGRWYlU=; b=nhp+6TYdyjZoY3Hv+vYNKrK21mPnayLsZAYNdql+ftrJuvdMaGV/X0d8BENtOlZKX3x2T4 weV6L6BA+ln3B4sm3MbKY2oUW6kvK5iMoVaYGsDpq8vR6PguGNrG13qfDnnelyvwK8Ky2Y s/73EaZWW5oS8ShgcWuXStCKf/GOrC2lPOxQ7arAsO0QgtMYlZxFIRCnFykv8qpI6QWtxD G/RkvWKQ4UvhVkvAwlsx7TI8JNAFwmgVfsfhDkKxhfYbefSjVnM+jGfxqMSzJKRebNVMwM uXVpEYHDm84xxQk45poa7WxksfMBse1YO7K12RXbHplY3dFjGvijipJ/PzklGg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1668107713; 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=AfHHQn8/sS9rEmHxq46obwFNRUuZcaTyNwNeYGRWYlU=; b=c2anTg3wnlWVMRMEkyY3Yw4iSEiKbYhdQJYYUfoDKP5g2fL9Jy1YXcreKvhvQwYgy6zqzl j7/SPEf5S2win2RSWAbFpfuLMlOwfStssteA3nfegbyC0KGxgQCE8qCroJ+bD+8FAb0Cev 14JzJP3belx1NkIkCsU1Tn83NzaMXOpLEqzs3UzGgEq25pVHT5NbXGl5vpigWLeo2+zG2d BUipQYGhsk2UhrakohvlxZVdV+rtP2ilsFrooMqivv0hto4is1dARZf/bqFWSa2pCgyNGi V6Qul4SOZ5domlToiUkYsaJhqMABRdgIryr30LHb8DYEW0T3nBBiGPAkEvlp1Q== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1668107713; a=rsa-sha256; cv=none; b=nfTCaoDURUKtCjkWLr2YkLjHfjeL/pbSKQQN6y8K7BaYuKZwZT+vnxxW9P3TEf06WQv7Zm R5CtBYRTRSLlRvk5Aj7TKh1dG0lkDJlDhOCM/dVHAoHcZoO2vrkLbjW8aHgKnxtWHA/4MT afm2kDlEH86/C7yAxEDoEHT/izF9Zbm8CMir0HngD6KgjlGpG9Y6y/MzlYjBHyGBVdILuG UQGOwHaOn0MVlNulxgaVTuyozTzggTT+g1fzAww7skiHTKMVx0sT+RAOijtKLv01Ut6nzQ sxv8Hnwjj3ui2ELvtEuiM+pgmsaoaLDwLXjUgTyU/MJDpun8aDmzP6Mc5b68AA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none 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 4N7WkT2TvCz1BtH; Thu, 10 Nov 2022 19:15:13 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 2AAJFDqJ000932; Thu, 10 Nov 2022 19:15:13 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 2AAJFDBL000931; Thu, 10 Nov 2022 19:15:13 GMT (envelope-from git) Date: Thu, 10 Nov 2022 19:15:13 GMT Message-Id: <202211101915.2AAJFDBL000931@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: John Baldwin Subject: git: a88b9a2d1f6c - stable/13 - Rework compat shims in ifioctl(). 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: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jhb X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: a88b9a2d1f6c3e5b461240291fd703ffc4a3c242 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=a88b9a2d1f6c3e5b461240291fd703ffc4a3c242 commit a88b9a2d1f6c3e5b461240291fd703ffc4a3c242 Author: John Baldwin AuthorDate: 2021-05-05 20:58:23 +0000 Commit: John Baldwin CommitDate: 2022-11-10 18:25:35 +0000 Rework compat shims in ifioctl(). Centralize logic for handling compat ioctls into two blocks of code at the start and end of the ioctl routine. This avoids the conversion logic being spread out both in multiple blocks in ifioctl as well as various helper functions. Reviewed by: brooks, kib Obtained from: CheriBSD Sponsored by: DARPA Differential Revision: https://reviews.freebsd.org/D29891 (cherry picked from commit d17e0940f79fd96a2bf27413c1fe682dd8ee5bac) --- sys/net/if.c | 118 +++++++++++++++++++++++++---------------------------------- 1 file changed, 49 insertions(+), 69 deletions(-) diff --git a/sys/net/if.c b/sys/net/if.c index b8aadbf03041..2389969fefd5 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -2938,38 +2938,6 @@ struct ifconf32 { }; #define SIOCGIFCONF32 _IOWR('i', 36, struct ifconf32) #endif - -#ifdef COMPAT_FREEBSD32 -static void -ifmr_init(struct ifmediareq *ifmr, caddr_t data) -{ - struct ifmediareq32 *ifmr32; - - ifmr32 = (struct ifmediareq32 *)data; - memcpy(ifmr->ifm_name, ifmr32->ifm_name, - sizeof(ifmr->ifm_name)); - ifmr->ifm_current = ifmr32->ifm_current; - ifmr->ifm_mask = ifmr32->ifm_mask; - ifmr->ifm_status = ifmr32->ifm_status; - ifmr->ifm_active = ifmr32->ifm_active; - ifmr->ifm_count = ifmr32->ifm_count; - ifmr->ifm_ulist = (int *)(uintptr_t)ifmr32->ifm_ulist; -} - -static void -ifmr_update(const struct ifmediareq *ifmr, caddr_t data) -{ - struct ifmediareq32 *ifmr32; - - ifmr32 = (struct ifmediareq32 *)data; - ifmr32->ifm_current = ifmr->ifm_current; - ifmr32->ifm_mask = ifmr->ifm_mask; - ifmr32->ifm_status = ifmr->ifm_status; - ifmr32->ifm_active = ifmr->ifm_active; - ifmr32->ifm_count = ifmr->ifm_count; -} -#endif - /* * Interface ioctls. */ @@ -2977,9 +2945,14 @@ int ifioctl(struct socket *so, u_long cmd, caddr_t data, struct thread *td) { #ifdef COMPAT_FREEBSD32 - caddr_t saved_data = NULL; - struct ifmediareq ifmr; - struct ifmediareq *ifmrp = NULL; + union { + struct ifconf ifc; + struct ifmediareq ifmr; + } thunk; + caddr_t saved_data; + u_long saved_cmd; + struct ifconf32 *ifc32; + struct ifmediareq32 *ifmr32; #endif struct ifnet *ifp; struct ifreq *ifr; @@ -2999,41 +2972,40 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct thread *td) } #endif - switch (cmd) { - case SIOCGIFCONF: - error = ifconf(cmd, data); - goto out_noref; - -#ifdef COMPAT_FREEBSD32 - case SIOCGIFCONF32: - { - struct ifconf32 *ifc32; - struct ifconf ifc; - - ifc32 = (struct ifconf32 *)data; - ifc.ifc_len = ifc32->ifc_len; - ifc.ifc_buf = PTRIN(ifc32->ifc_buf); - - error = ifconf(SIOCGIFCONF, (void *)&ifc); - if (error == 0) - ifc32->ifc_len = ifc.ifc_len; - goto out_noref; - } -#endif - } - #ifdef COMPAT_FREEBSD32 + saved_cmd = cmd; + saved_data = data; switch (cmd) { + case SIOCGIFCONF32: + ifc32 = (struct ifconf32 *)data; + thunk.ifc.ifc_len = ifc32->ifc_len; + thunk.ifc.ifc_buf = PTRIN(ifc32->ifc_buf); + data = (caddr_t)&thunk.ifc; + cmd = SIOCGIFCONF; + break; case SIOCGIFMEDIA32: case SIOCGIFXMEDIA32: - ifmrp = &ifmr; - ifmr_init(ifmrp, data); + ifmr32 = (struct ifmediareq32 *)data; + memcpy(thunk.ifmr.ifm_name, ifmr32->ifm_name, + sizeof(thunk.ifmr.ifm_name)); + thunk.ifmr.ifm_current = ifmr32->ifm_current; + thunk.ifmr.ifm_mask = ifmr32->ifm_mask; + thunk.ifmr.ifm_status = ifmr32->ifm_status; + thunk.ifmr.ifm_active = ifmr32->ifm_active; + thunk.ifmr.ifm_count = ifmr32->ifm_count; + thunk.ifmr.ifm_ulist = PTRIN(ifmr32->ifm_ulist); + data = (caddr_t)&thunk.ifmr; cmd = _IOC_NEWTYPE(cmd, struct ifmediareq); - saved_data = data; - data = (caddr_t)ifmrp; + break; } #endif + switch (cmd) { + case SIOCGIFCONF: + error = ifconf(cmd, data); + goto out_noref; + } + ifr = (struct ifreq *)data; switch (cmd) { #ifdef VIMAGE @@ -3123,16 +3095,24 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct thread *td) out_ref: if_rele(ifp); out_noref: + CURVNET_RESTORE(); #ifdef COMPAT_FREEBSD32 - if (ifmrp != NULL) { - KASSERT((cmd == SIOCGIFMEDIA || cmd == SIOCGIFXMEDIA), - ("ifmrp non-NULL, but cmd is not an ifmedia req 0x%lx", - cmd)); - data = saved_data; - ifmr_update(ifmrp, data); + if (error != 0) + return (error); + switch (saved_cmd) { + case SIOCGIFCONF32: + ifc32->ifc_len = thunk.ifc.ifc_len; + break; + case SIOCGIFMEDIA32: + case SIOCGIFXMEDIA32: + ifmr32->ifm_current = thunk.ifmr.ifm_current; + ifmr32->ifm_mask = thunk.ifmr.ifm_mask; + ifmr32->ifm_status = thunk.ifmr.ifm_status; + ifmr32->ifm_active = thunk.ifmr.ifm_active; + ifmr32->ifm_count = thunk.ifmr.ifm_count; + break; } #endif - CURVNET_RESTORE(); return (error); }