From patchwork Mon Apr 13 23:42:13 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Felix Fietkau X-Patchwork-Id: 460967 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 9F3C1140280 for ; Tue, 14 Apr 2015 09:42:27 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754378AbbDMXmX (ORCPT ); Mon, 13 Apr 2015 19:42:23 -0400 Received: from static.88-198-24-112.clients.your-server.de ([88.198.24.112]:53107 "EHLO nbd.name" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751980AbbDMXmV (ORCPT ); Mon, 13 Apr 2015 19:42:21 -0400 Received: by nf.lan (Postfix, from userid 501) id DF229DB36DBB; Tue, 14 Apr 2015 01:42:17 +0200 (CEST) From: Felix Fietkau To: netdev@vger.kernel.org Cc: zajec5@gmail.com, hauke@hauke-m.de Subject: [PATCH v6 5/9] bgmac: add check for oversized packets Date: Tue, 14 Apr 2015 01:42:13 +0200 Message-Id: <1428968537-6181-5-git-send-email-nbd@openwrt.org> X-Mailer: git-send-email 2.2.2 In-Reply-To: <1428968537-6181-1-git-send-email-nbd@openwrt.org> References: <1428968537-6181-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 Acked-by: Rafał Miłecki --- drivers/net/ethernet/broadcom/bgmac.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/net/ethernet/broadcom/bgmac.c b/drivers/net/ethernet/broadcom/bgmac.c index f897e62..eafdbca 100644 --- a/drivers/net/ethernet/broadcom/bgmac.c +++ b/drivers/net/ethernet/broadcom/bgmac.c @@ -440,6 +440,13 @@ 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); + put_page(virt_to_head_page(buf)); + break; + } + /* Omit CRC. */ len -= ETH_FCS_LEN;