From patchwork Sun Apr 12 21:38:27 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Felix Fietkau X-Patchwork-Id: 460570 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 670A81402F4 for ; Mon, 13 Apr 2015 07:39:02 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753076AbbDLVi6 (ORCPT ); Sun, 12 Apr 2015 17:38:58 -0400 Received: from static.88-198-24-112.clients.your-server.de ([88.198.24.112]:48619 "EHLO nbd.name" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752553AbbDLVig (ORCPT ); Sun, 12 Apr 2015 17:38:36 -0400 Received: by nf.lan (Postfix, from userid 501) id 6BF12DAB928D; Sun, 12 Apr 2015 23:38:31 +0200 (CEST) From: Felix Fietkau To: netdev@vger.kernel.org Cc: zajec5@gmail.com, hauke@hauke-m.de, eric.dumazet@gmail.com Subject: [PATCH v3 5/9] bgmac: add check for oversized packets Date: Sun, 12 Apr 2015 23:38:27 +0200 Message-Id: <1428874711-23950-5-git-send-email-nbd@openwrt.org> X-Mailer: git-send-email 2.2.2 In-Reply-To: <1428874711-23950-1-git-send-email-nbd@openwrt.org> References: <1428874711-23950-1-git-send-email-nbd@openwrt.org> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org In very rare cases, the MAC can catch an internal buffer that is bigger than it's supposed to be. Instead of crashing the kernel, simply pass the buffer back to the hardware Signed-off-by: Felix Fietkau --- drivers/net/ethernet/broadcom/bgmac.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/net/ethernet/broadcom/bgmac.c b/drivers/net/ethernet/broadcom/bgmac.c index e004588..3ac8d9a 100644 --- a/drivers/net/ethernet/broadcom/bgmac.c +++ b/drivers/net/ethernet/broadcom/bgmac.c @@ -422,6 +422,14 @@ static int bgmac_dma_rx_read(struct bgmac *bgmac, struct bgmac_dma_ring *ring, break; } + if (len > BGMAC_RX_ALLOC_SIZE) { + bgmac_err(bgmac, "Found oversized packet at slot %d, DMA issue!\n", + ring->start); + rx->len = cpu_to_le16(0xdead); + rx->flags = cpu_to_le16(0xbeef); + break; + } + /* Omit CRC. */ len -= ETH_FCS_LEN;