Received: by 2002:a5b:505:0:0:0:0:0 with SMTP id o5csp70465ybp; Thu, 3 Oct 2019 10:18:12 -0700 (PDT) X-Google-Smtp-Source: APXvYqx3Rb3Ucr4p/TQ8CMLhhiO4Oq9xxJHEFBieD0p/OVUJd8C/Y18EhHaIHB6dD0aDlV1wPwEy X-Received: by 2002:a50:d096:: with SMTP id v22mr10777724edd.81.1570123092528; Thu, 03 Oct 2019 10:18:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1570123092; cv=none; d=google.com; s=arc-20160816; b=UBejweowNPwDfm+aXNUd5rmmfjJ7ABLBZ/rStvgHiJb40VRlLPxMcWu+quAvV1vUhB wYypLDS+F9gpQmVYzsgi+V+tHqAXnTGqIUwm/guT3HLQgQEDr4A6ggS0O5WsPtYliQaW WX6TFjqmAbYduJGUFbvuAnOi14XSKhB4hRP4SMQWhXO8z/z01WEQgmG93q69ESm+u9y/ MxmIaHjvFamul6y5r+/15yKNXZozhwpgHqt4RqOOcaar26kKKlMu4z52k/b7EBFdp2ia hECYlaavoQzOL0NvDHYp+YQxNMjEd0AhgtFCDbA6r48yXOgS454SI9FX54tFUMIX9pwW HRTA== 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=cTAWDoOI4xrX5RzNKZDfLJpGR470H1n8DrXs8ZMHnPs=; b=x0iEa2oQEul7SZ9593jZnuDMohh+hmR/KnWFdEM+1N4/OIMWAP8HoICLqVKieAPx8W vIWaH6N7UbMO68cW89LhDGRetV5+ZURioThR9NIH6w2ITbbeL0Blr3cXxajzWb5zfrNQ miwZE5oTboyMsqq2CI5t9oJ/QNKdm/3AcoDLsZ/OmcZGRn9Cn1rW23LWKAM8wQl54kOm sQIOzZYFu25Kk5SSBoVbAu2LO9E+IsTNvnHIAisEAo0LmfoOa9QvnlXOlMqfYTfk5UJd /TriZHx5IJOT5VDslVDX1j2G/89sxtMpvIwcWSrMage3b6MjhQWVtDf7hh8qlqdcJUr0 bCjg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=0XmsPca4; 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 r17si1816882edp.400.2019.10.03.10.17.48; Thu, 03 Oct 2019 10:18:12 -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=0XmsPca4; 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 S2388078AbfJCQYY (ORCPT + 99 others); Thu, 3 Oct 2019 12:24:24 -0400 Received: from mail.kernel.org ([198.145.29.99]:53912 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389950AbfJCQYW (ORCPT ); Thu, 3 Oct 2019 12:24:22 -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 B989D2054F; Thu, 3 Oct 2019 16:24:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1570119861; bh=VtSc1ME8SN1wgVSZQutqFakL7GH/xf7ew/ekejUwB/A=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=0XmsPca4/0RlixSQMw042us4ACMe2+qh65sTDbXfkIbpeQH89dcD1svNDeEYjDNvp UOgQ0HHs6uztbZVaAPD5yIURejrFNCV9lRVbPux+QuhFAVLiE8jzbRFRxgn8fLqfiV +K0ohohAdzR0l6IqYUdn3xHmE8Xqxy5d26CFSxVA= 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 5.2 001/313] arcnet: provide a buffer big enough to actually receive packets Date: Thu, 3 Oct 2019 17:49:39 +0200 Message-Id: <20191003154533.710270712@linuxfoundation.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191003154533.590915454@linuxfoundation.org> References: <20191003154533.590915454@linuxfoundation.org> User-Agent: quilt/0.66 X-stable: review X-Patchwork-Hint: ignore 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 @@ -1063,31 +1063,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; @@ -1096,13 +1099,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); } } @@ -1111,10 +1114,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,