Received: by 2002:a5b:505:0:0:0:0:0 with SMTP id o5csp176195ybp; Thu, 3 Oct 2019 11:53:21 -0700 (PDT) X-Google-Smtp-Source: APXvYqxfi5iJeIMpzLiNihXbVpqyTYb40p7zroZgYOmp5i6EnzXwUwxqHDzCMhNnc1W80bZMTQAd X-Received: by 2002:a05:6402:782:: with SMTP id d2mr11035309edy.296.1570128801479; Thu, 03 Oct 2019 11:53:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1570128801; cv=none; d=google.com; s=arc-20160816; b=mxBzSQO5Oso+EJMFCmBf63ld/6G5pYkKCEbRKzOUZsW3Rk1Q6BscPkh5WgBxdJSerI fFUfHI449tGxxx6jA3KIwIDIWSlT6An1sSNRumPq3h1pmY00XvqOSotQqfDjMKLKdWpL 1j/5OlF6Bq6BnuX5SmFPBzbXALHZ7HiWZVaTFJxMDR9mBqILONziqWwowwblleEHJaBL lx4JCAwKn//7QYheZzy8wG6A3+vYhNfMknmuyftKHrf7mPwTgmvmsKolYT/Y/mJaM8qb 0XkR2qRWtok33YbpqV8WBQ2HQxIpR04aIoy5LhsSzSqiXCtsEVKBHDrYAPVX/v7GF9jw Drhg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=9xTUoxfpdPrTE3iEIyMgzJOv176NhUkLR4eCACtzIFc=; b=AXHWocY3kxi0J6nJOaQEOsY4AChiMm59/NZ8dSfaAaFzZgl0zsYuqqZ1e2dgd7LQZC ndghxpm+GZCqbEiYE/fh6wZTa7YcTkZ80vzqJT/Z86k6MOMRymnGFKc6D2VJn+zIIp5s smRbQzEsYtS2724FdRWwo1rnx8l7CTzbxL72dKVq2/e++H6JKOHBmzWH7udJemBXa2Hs L7inwe6jhT9Nlz5CP654VTvuNVgCRyMQxj1OchLd8WK3RuEPbgc+tBJUgGYkMFWItRqq n05QqWxtGZbzRP0J0pOz+C6gm6r4nub05of4tchg3nZSaDQVBpV97S8vXpSycJlbWwpz XHig== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=oj95QolT; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t4si1635845ejd.328.2019.10.03.11.52.56; Thu, 03 Oct 2019 11:53:21 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=oj95QolT; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730659AbfJCP4f (ORCPT + 99 others); Thu, 3 Oct 2019 11:56:35 -0400 Received: from mail.kernel.org ([198.145.29.99]:38276 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730597AbfJCP4Z (ORCPT ); Thu, 3 Oct 2019 11:56:25 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 8287821A4C; Thu, 3 Oct 2019 15:56:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1570118185; bh=2OU/aDDl5if082keo3Lhq1ZCrxI0CLsaFeUqmdsqnOA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oj95QolTunlcDzHfYvz3jFqECfoWDYM4IRvG1tRnZfL8E8/OLayw6MUjeyBRSI49A +8VujKCgdnyhhejCJDBeemmvraR2fCftumWfS3ok0APWwQzzMfITvW5rNHgY8msydY /VZ+KIumlh8ni8CB4gJYdtdYyVKgitOqutr1knBM= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= , Michael Grzeschik , "David S. Miller" Subject: [PATCH 4.4 20/99] arcnet: provide a buffer big enough to actually receive packets Date: Thu, 3 Oct 2019 17:52:43 +0200 Message-Id: <20191003154303.294917042@linuxfoundation.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191003154252.297991283@linuxfoundation.org> References: <20191003154252.297991283@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Uwe Kleine-König [ Upstream commit 108639aac35eb57f1d0e8333f5fc8c7ff68df938 ] struct archdr is only big enough to hold the header of various types of arcnet packets. So to provide enough space to hold the data read from hardware provide a buffer large enough to hold a packet with maximal size. The problem was noticed by the stack protector which makes the kernel oops. Signed-off-by: Uwe Kleine-König Acked-by: Michael Grzeschik Signed-off-by: David S. Miller Signed-off-by: Greg Kroah-Hartman --- drivers/net/arcnet/arcnet.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) --- a/drivers/net/arcnet/arcnet.c +++ b/drivers/net/arcnet/arcnet.c @@ -1009,31 +1009,34 @@ EXPORT_SYMBOL(arcnet_interrupt); static void arcnet_rx(struct net_device *dev, int bufnum) { struct arcnet_local *lp = netdev_priv(dev); - struct archdr pkt; + union { + struct archdr pkt; + char buf[512]; + } rxdata; struct arc_rfc1201 *soft; int length, ofs; - soft = &pkt.soft.rfc1201; + soft = &rxdata.pkt.soft.rfc1201; - lp->hw.copy_from_card(dev, bufnum, 0, &pkt, ARC_HDR_SIZE); - if (pkt.hard.offset[0]) { - ofs = pkt.hard.offset[0]; + lp->hw.copy_from_card(dev, bufnum, 0, &rxdata.pkt, ARC_HDR_SIZE); + if (rxdata.pkt.hard.offset[0]) { + ofs = rxdata.pkt.hard.offset[0]; length = 256 - ofs; } else { - ofs = pkt.hard.offset[1]; + ofs = rxdata.pkt.hard.offset[1]; length = 512 - ofs; } /* get the full header, if possible */ - if (sizeof(pkt.soft) <= length) { - lp->hw.copy_from_card(dev, bufnum, ofs, soft, sizeof(pkt.soft)); + if (sizeof(rxdata.pkt.soft) <= length) { + lp->hw.copy_from_card(dev, bufnum, ofs, soft, sizeof(rxdata.pkt.soft)); } else { - memset(&pkt.soft, 0, sizeof(pkt.soft)); + memset(&rxdata.pkt.soft, 0, sizeof(rxdata.pkt.soft)); lp->hw.copy_from_card(dev, bufnum, ofs, soft, length); } arc_printk(D_DURING, dev, "Buffer #%d: received packet from %02Xh to %02Xh (%d+4 bytes)\n", - bufnum, pkt.hard.source, pkt.hard.dest, length); + bufnum, rxdata.pkt.hard.source, rxdata.pkt.hard.dest, length); dev->stats.rx_packets++; dev->stats.rx_bytes += length + ARC_HDR_SIZE; @@ -1042,13 +1045,13 @@ static void arcnet_rx(struct net_device if (arc_proto_map[soft->proto]->is_ip) { if (BUGLVL(D_PROTO)) { struct ArcProto - *oldp = arc_proto_map[lp->default_proto[pkt.hard.source]], + *oldp = arc_proto_map[lp->default_proto[rxdata.pkt.hard.source]], *newp = arc_proto_map[soft->proto]; if (oldp != newp) { arc_printk(D_PROTO, dev, "got protocol %02Xh; encap for host %02Xh is now '%c' (was '%c')\n", - soft->proto, pkt.hard.source, + soft->proto, rxdata.pkt.hard.source, newp->suffix, oldp->suffix); } } @@ -1057,10 +1060,10 @@ static void arcnet_rx(struct net_device lp->default_proto[0] = soft->proto; /* in striking contrast, the following isn't a hack. */ - lp->default_proto[pkt.hard.source] = soft->proto; + lp->default_proto[rxdata.pkt.hard.source] = soft->proto; } /* call the protocol-specific receiver. */ - arc_proto_map[soft->proto]->rx(dev, bufnum, &pkt, length); + arc_proto_map[soft->proto]->rx(dev, bufnum, &rxdata.pkt, length); } static void null_rx(struct net_device *dev, int bufnum,