From nobody Mon Mar 07 17:45:53 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 B5B9919F1E5A; Mon, 7 Mar 2022 17:45:53 +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 4KC5Ts4khpz4tt2; Mon, 7 Mar 2022 17:45:53 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1646675153; 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=za7TFh/tTRBXeSjjJUpRyTVc42grXaehgOZ8F1mwWLI=; b=iEoqJ9hVZBK4XkDMEKtfkR77mZC4R4DBgVpxmh79GTTlayLkxY59F1yYn0QWaXoiASONwe r79sIUm8Wo6rgWZEP5IkvzSoSC2HTA8Qy1ruaRzbCAEByW6eTlAVnmRA2nyuyT/g6OIME9 JlLeOsfUH5rIjtVYL3PbBOrsctSn64VbVpnhYR27JIpPmQOzg8ix8ZwTb/thSKDIQ2ur/m EYiJXAvZWHlglcUAGgMNf0uy/13xxFTwqwrsbCDNGhlwGdj41p62NJEpg01KDeGB0viGE1 kykfrQ6vmZH25Gy8oHqDSju/LPI+yykN9l1BtzzjYvMdpiqzxY08ELT50hz8gw== 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 822314C1E; Mon, 7 Mar 2022 17:45:53 +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 227HjrbJ012430; Mon, 7 Mar 2022 17:45:53 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 227HjrI7012429; Mon, 7 Mar 2022 17:45:53 GMT (envelope-from git) Date: Mon, 7 Mar 2022 17:45:53 GMT Message-Id: <202203071745.227HjrI7012429@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Ryan Stone Subject: git: 617729314af3 - stable/13 - Fix ifa refcount leak in ifa_ifwithnet() 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: rstone X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: 617729314af33b28ffaf42261561ccce1ab817c8 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1646675153; 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=za7TFh/tTRBXeSjjJUpRyTVc42grXaehgOZ8F1mwWLI=; b=eF/3IVBN3uGzeZ3AwQF85l3fpwShRKel6v5feEagAaZ3t2TmLWv9ODRBvyH6vVL2l+8oGO WcyGI2inD7A0UVjH9lVMyqcXWPx3o6gaG/GFGMPB0l6ipSBQbidPrzTgGPDB/CMlAy8hfN Rtppm5T/7xTaZvYhhR+mnoPnc/ngnCedDrt5PoCfBMqXgQvvUAoSZAUE7FSD4UWqpeJMwB C13g7H8GjH5xQcGcpbzVkJvdtaLlZiXKD+efgbVAf5VAhraQ6vmmTeacGxXCGeO5GGxwAj UUTgad8hDomxJlLnaTOXgNi/6XvQuIx6CK+eH8jOCZBsZWdyY1eXtS3Ia9OxwA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1646675153; a=rsa-sha256; cv=none; b=SB5QmBX5WNLbEnJBye/+EULFl8Pjjq/A413Nte32my32JJ26OL85mH8EL8QuX0/y0eW75h lNX0HucGilOuSKt22mw1/4cBR4fGCGDGyHw9jjWDtu/vtlvDKeIdvdXQgrAi/vSEsJieGf NDz712PAMGLN6GKJRFXEBmgeQ2OFvsuwmbDxN07dTjAOjVu4zEYr56T4aVAVP4u3qehU6R aTs+Dbf0ybX6TR4X6iKvL/hUh2LLudIvCcZdVaLv1hGpaOHffOONXcBw57Ksq8S/bM530N c9n9I5gpSc4MyI6jvByRn6Xgf1P3+QZFCvgDzr1ATSos8jpyv4dWcchuzMX4zQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by rstone: URL: https://cgit.FreeBSD.org/src/commit/?id=617729314af33b28ffaf42261561ccce1ab817c8 commit 617729314af33b28ffaf42261561ccce1ab817c8 Author: Ryan Stone AuthorDate: 2021-02-11 16:17:58 +0000 Commit: Ryan Stone CommitDate: 2022-03-07 17:41:40 +0000 Fix ifa refcount leak in ifa_ifwithnet() In 4f6c66cc9c75c8, ifa_ifwithnet() was changed to no longer ifa_ref() the returned ifaddr, and instead the caller was required to stay in the net_epoch for as long as they wanted the ifaddr to remain valid. However, this missed the case where an AF_LINK lookup would call ifaddr_byindex(), which still does ifa_ref() the ifaddr. This would cause a refcount leak. Fix this by inlining the relevant parts of ifaddr_byindex() here, with the ifa_ref() call removed. This also avoids an unnecessary entry and exit from the net_epoch for this case. I've audited all in-tree consumers of ifa_ifwithnet() that could possibly perform an AF_LINK lookup and confirmed that none of them will expect the ifaddr to have a reference that they need to release. MFC after: 2 months Sponsored by: Dell Inc Differential Revision: https://reviews.freebsd.org/D28705 Reviewed by: melifaro (cherry picked from commit 5adea417d494b9c0e186cf2d06f98873d02d1834) --- sys/net/if.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/sys/net/if.c b/sys/net/if.c index 7d7206e7596c..d4871ccbc1f7 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -2032,6 +2032,7 @@ ifa_ifwithnet(const struct sockaddr *addr, int ignore_ptp, int fibnum) struct ifaddr *ifa_maybe = NULL; u_int af = addr->sa_family; const char *addr_data = addr->sa_data, *cplim; + const struct sockaddr_dl *sdl; NET_EPOCH_ASSERT(); /* @@ -2039,9 +2040,14 @@ ifa_ifwithnet(const struct sockaddr *addr, int ignore_ptp, int fibnum) * so do that if we can. */ if (af == AF_LINK) { - const struct sockaddr_dl *sdl = (const struct sockaddr_dl *)addr; - if (sdl->sdl_index && sdl->sdl_index <= V_if_index) - return (ifaddr_byindex(sdl->sdl_index)); + sdl = (const struct sockaddr_dl *)addr; + if (sdl->sdl_index && sdl->sdl_index <= V_if_index) { + ifp = ifnet_byindex(sdl->sdl_index); + if (ifp == NULL) + return (NULL); + + return (ifp->if_addr); + } } /*