Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp1403953pxk; Fri, 2 Oct 2020 08:45:46 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzxiN3QcxU8xntW/qoZHKB1ddoQpDACuVxxIypcoQvpr2Xb7PNkvvo2jlCcQPdAKVXsxjd5 X-Received: by 2002:a17:906:5046:: with SMTP id e6mr3013220ejk.449.1601653546595; Fri, 02 Oct 2020 08:45:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1601653546; cv=none; d=google.com; s=arc-20160816; b=MEQhO6hdS2sr0woNp1cDkg0WpF9lX1XAuZfdhkGXWJsUp0ci3rdtlO98nvKRJaGIPg pyJ7lLsN1jdFVSYbEzLd0zwFR9elqkpzbnGT5QuZk2i+OYrN5INMPvz9DDWu82ueEafE 9KlJdF2Wczx8puEE75juQtVGHyq5PPW2VjvJ0egSzO7qPshVeBokW/ljiHfDTo5U1LpS GAjmc6pA8T4HvdQ1pumVhUIqOvZnQkKAEupduQ3DXe9mdLpcsPsYCH2myuNqk/ddHOHf u1PgY1YfYnZhI5F8IN/JLMDw6Z0324i8aySkU5JXs42+PxYhN84yLyVO/9tueBslpeCd k1Zg== 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 :references:in-reply-to:message-id:date:subject:cc:to:from; bh=ginmCWSw7rJglSredMRG8OPjXTa0Ew7yWsQr24YbFdM=; b=yXM4WCJyXO9ziNSshCfermg2ot1poNCQ4pOrVdiBanGY98W+uzcz2pnj02zo5VbO4z bdW969nd0x4ZTKtSvV2NkZiJ3dr9h57g7naAgjxfacixDBFW6s27Hqz0LtKDf2YxJVI+ 9amcvBkx2w74qpSk72uEtkMJ24mJhsrX/MKgYeviDznRf69yRRwghGZCM2gduO0juAx3 9m3ZhuQNTnG32Aa5Cfcr/IjFJ5fNO7z5ymiWCim3a/lipt6rvDOdeIQfytuoit0f/iOR 5IdEt7d7N0xQ0GKkVKq+b3noQ2EELCND0ldiyURNCGN4jc9fkQ8DG6zLqFwfEj5TXYvs CDbA== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id p89si1310519edd.109.2020.10.02.08.45.23; Fri, 02 Oct 2020 08:45:46 -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; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388030AbgJBPo0 (ORCPT + 99 others); Fri, 2 Oct 2020 11:44:26 -0400 Received: from smtp13.smtpout.orange.fr ([80.12.242.135]:33534 "EHLO smtp.smtpout.orange.fr" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S2387688AbgJBPoZ (ORCPT ); Fri, 2 Oct 2020 11:44:25 -0400 Received: from tomoyo.flets-east.jp ([153.230.197.127]) by mwinf5d76 with ME id b3kG2300D2lQRaH033kKxQ; Fri, 02 Oct 2020 17:44:24 +0200 X-ME-Helo: tomoyo.flets-east.jp X-ME-Auth: bWFpbGhvbC52aW5jZW50QHdhbmFkb28uZnI= X-ME-Date: Fri, 02 Oct 2020 17:44:24 +0200 X-ME-IP: 153.230.197.127 From: Vincent Mailhol To: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-can@vger.kernel.org, Wolfgang Grandegger , Marc Kleine-Budde , "David S . Miller" , Jakub Kicinski Cc: Vincent Mailhol , Oliver Neukum , Greg Kroah-Hartman , Arunachalam Santhanam , Masahiro Yamada , linux-usb@vger.kernel.org (open list:USB ACM DRIVER) Subject: [PATCH v3 1/7] can: dev: can_get_echo_skb(): prevent call to kfree_skb() in hard IRQ context Date: Sat, 3 Oct 2020 00:41:45 +0900 Message-Id: <20201002154219.4887-2-mailhol.vincent@wanadoo.fr> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20201002154219.4887-1-mailhol.vincent@wanadoo.fr> References: <20200926175810.278529-1-mailhol.vincent@wanadoo.fr> <20201002154219.4887-1-mailhol.vincent@wanadoo.fr> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If a driver calls can_get_echo_skb() during a hardware IRQ (which is often, but not always, the case), the 'WARN_ON(in_irq)' in net/core/skbuff.c#skb_release_head_state() might be triggered, under network congestion circumstances, together with the potential risk of a NULL pointer dereference. The root cause of this issue is the call to kfree_skb() instead of dev_kfree_skb_irq() in net/core/dev.c#enqueue_to_backlog(). This patch prevents the skb to be freed within the call to netif_rx() by incrementing its reference count with skb_get(). The skb is finally freed by one of the in-irq-context safe functions: dev_consume_skb_any() or dev_kfree_skb_any(). The "any" version is used because some drivers might call can_get_echo_skb() in a normal context. The reason for this issue to occur is that initially, in the core network stack, loopback skb were not supposed to be received in hardware IRQ context. The CAN stack is an exeption. This bug was previously reported back in 2017 in [1] but the proposed patch never got accepted. While [1] directly modifies net/core/dev.c, we try to propose here a smoother modification local to CAN network stack (the assumption behind is that only CAN devices are affected by this issue). [1] https://patchwork.ozlabs.org/patch/835236/ Signed-off-by: Vincent Mailhol --- Changes in v3: None Changes in v2: - Minor changes of link format in the changelog. --- drivers/net/can/dev.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c index 68834a2853c9..e291fda395a0 100644 --- a/drivers/net/can/dev.c +++ b/drivers/net/can/dev.c @@ -512,7 +512,11 @@ unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx) if (!skb) return 0; - netif_rx(skb); + skb_get(skb); + if (netif_rx(skb) == NET_RX_SUCCESS) + dev_consume_skb_any(skb); + else + dev_kfree_skb_any(skb); return len; } -- 2.26.2