Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp3325689pxf; Mon, 5 Apr 2021 09:05:22 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyNkejVH8VSSXTgB8S/CweNar8kr00hcBkCc/scP9J34A7WWBHW9R4x4UjzKyBL4mVjfCRg X-Received: by 2002:a7b:cbcd:: with SMTP id n13mr25362666wmi.112.1617638722556; Mon, 05 Apr 2021 09:05:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1617638722; cv=none; d=google.com; s=arc-20160816; b=XWgzaymUBEpXrOuMrQaGfYlILIeqvuCAG+klSb6fij6C3uDlzomCC8Miro9XEHboep 511n8dspApjuTfBiKqJBzkso6n+Ch4DSwR8WdbwmzXdoHjh200kXWOJY2DpV2xMH9i+0 aajSgWm6lK7an4sqoMkN+dTaZ9Hn6BQ9V9eaVbmuOWJzluMggUjnjQnomQlHjeRto/Z0 kG9tl+wy7GnUQG81AO7lALUH1xuCTqmyKYtnGj1XPDBtc28H7qcTB7v+/uDnc238SwbT c0hbL63VMOTol1VHAvzTGPPgh2VbHjCN2EeoitFHnhlpBDy2IaangFSR0fU0+6NKumRU izug== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=SaHlp4KI2G3bSouwC+TIHlkn89uLH6jLLFT+M6Ci860=; b=v25RtXd7SsHj46bB8P1Dy38UQhdQWm0b8wY2scxSBa/jwSosNkhIdxYUiAyu7XdfFb XachAQcX+qdQztdBAXkF4K+qvckWFrLuJzNgfsYXOOUN199w6hmAT/D5FybW+ngKHXGM xpyKyWXy38x481UVKeIIbN1zAIVq1H3YEEwMLzVO/wRRHYQQ5Lb+ZLvjIMEYQC2I4vjv +D0wv9zgnlWaQO7iIQXx/etQKoNRGuVk7qqlrJKqCn9Q833dev1axIyyyJ+bUGiff4Xd mjBJJLtX3wZv0zUU8i7QEqHj9qdTJufzyXf+xJIFwbL5OHuqX3+T8ONu2XvaF1WcaNL/ wlQw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=LBliimLc; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id w25si13695479ejv.100.2021.04.05.09.04.58; Mon, 05 Apr 2021 09:05:22 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=LBliimLc; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238663AbhDEJKI (ORCPT + 99 others); Mon, 5 Apr 2021 05:10:08 -0400 Received: from mail.kernel.org ([198.145.29.99]:53378 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238423AbhDEJHy (ORCPT ); Mon, 5 Apr 2021 05:07:54 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 8233D613A0; Mon, 5 Apr 2021 09:07:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1617613669; bh=F5M4lswSRCqM9j45ZUNNTIPNsts9Bq2SQKKkvRXMc20=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=LBliimLcOTMtu2YXOaE4Ne+WitJKIC6lgcUkZUf5r4ErUHoJcj1TbHH8m+hKHI/u0 28aTGVx+jjfR7IbiOB7RXqjbX3CgVUvSvtbBbxQxf/agcKjHBUeHslTGxeno17Y6XK WQxxN6rmdzmwYKtfZ8ghDm7GOTHliP99rPBZ6Wl8= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Doug Brown , "David S. Miller" , Sasha Levin Subject: [PATCH 5.10 049/126] appletalk: Fix skb allocation size in loopback case Date: Mon, 5 Apr 2021 10:53:31 +0200 Message-Id: <20210405085032.660245970@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210405085031.040238881@linuxfoundation.org> References: <20210405085031.040238881@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Doug Brown [ Upstream commit 39935dccb21c60f9bbf1bb72d22ab6fd14ae7705 ] If a DDP broadcast packet is sent out to a non-gateway target, it is also looped back. There is a potential for the loopback device to have a longer hardware header length than the original target route's device, which can result in the skb not being created with enough room for the loopback device's hardware header. This patch fixes the issue by determining that a loopback will be necessary prior to allocating the skb, and if so, ensuring the skb has enough room. This was discovered while testing a new driver that creates a LocalTalk network interface (LTALK_HLEN = 1). It caused an skb_under_panic. Signed-off-by: Doug Brown Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- net/appletalk/ddp.c | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c index 1d48708c5a2e..c94b212d8e7c 100644 --- a/net/appletalk/ddp.c +++ b/net/appletalk/ddp.c @@ -1576,8 +1576,8 @@ static int atalk_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) struct sk_buff *skb; struct net_device *dev; struct ddpehdr *ddp; - int size; - struct atalk_route *rt; + int size, hard_header_len; + struct atalk_route *rt, *rt_lo = NULL; int err; if (flags & ~(MSG_DONTWAIT|MSG_CMSG_COMPAT)) @@ -1640,7 +1640,22 @@ static int atalk_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) SOCK_DEBUG(sk, "SK %p: Size needed %d, device %s\n", sk, size, dev->name); - size += dev->hard_header_len; + hard_header_len = dev->hard_header_len; + /* Leave room for loopback hardware header if necessary */ + if (usat->sat_addr.s_node == ATADDR_BCAST && + (dev->flags & IFF_LOOPBACK || !(rt->flags & RTF_GATEWAY))) { + struct atalk_addr at_lo; + + at_lo.s_node = 0; + at_lo.s_net = 0; + + rt_lo = atrtr_find(&at_lo); + + if (rt_lo && rt_lo->dev->hard_header_len > hard_header_len) + hard_header_len = rt_lo->dev->hard_header_len; + } + + size += hard_header_len; release_sock(sk); skb = sock_alloc_send_skb(sk, size, (flags & MSG_DONTWAIT), &err); lock_sock(sk); @@ -1648,7 +1663,7 @@ static int atalk_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) goto out; skb_reserve(skb, ddp_dl->header_length); - skb_reserve(skb, dev->hard_header_len); + skb_reserve(skb, hard_header_len); skb->dev = dev; SOCK_DEBUG(sk, "SK %p: Begin build.\n", sk); @@ -1699,18 +1714,12 @@ static int atalk_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) /* loop back */ skb_orphan(skb); if (ddp->deh_dnode == ATADDR_BCAST) { - struct atalk_addr at_lo; - - at_lo.s_node = 0; - at_lo.s_net = 0; - - rt = atrtr_find(&at_lo); - if (!rt) { + if (!rt_lo) { kfree_skb(skb); err = -ENETUNREACH; goto out; } - dev = rt->dev; + dev = rt_lo->dev; skb->dev = dev; } ddp_dl->request(ddp_dl, skb, dev->dev_addr); -- 2.30.1