Received: by 2002:a05:6a10:6d10:0:0:0:0 with SMTP id gq16csp901075pxb; Fri, 15 Apr 2022 14:47:32 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy0L8YwXqZMIMM2A8B7RGx2xAB7gge5QIlVXNGuAp5ss6NHOKnnPuSmd8DOZYcHGsi7N2zI X-Received: by 2002:a17:90b:2685:b0:1cb:6521:dd78 with SMTP id pl5-20020a17090b268500b001cb6521dd78mr900493pjb.194.1650059252325; Fri, 15 Apr 2022 14:47:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1650059252; cv=none; d=google.com; s=arc-20160816; b=PemlVBHsZsHDvUmy18JnXZ977HdajEh4SfKZpWxjrMmXqoFUrdxJG9QDOQSswxh+LU eXljy+vw0LOtI2YoW/IcAx4MJ0XDbMZpSyhbIR+q5I+VeTaktTiqWawNmDA88L4gYqAW ZI9bMX/ecrk18cmB805gt5SPZo7jIGrXy/p6ZXg8kNXw9aUfFpJ+fr2d4QaNYWrgQ0Ul jJ13roTwNAgC5fNBsKMIG0P/B8AYLfYgNJkmgloqH+taVtU1tBuFVWG59+btPsowVLQy 8M4OSvMt4yzY1NIhzGQim3D5HB18br6dF4c/v12QtmeXvPSdiTOJPTI60TxcJhpbB0Ep m8XA== 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 :dkim-signature; bh=Vf75TiqrDs9Xy+FgQuO5VDyKrFCIlVjIyCetakykwl0=; b=fyf/c+nGhoeo4kA/M2/A2uMNJeLz9e6D8sJnAg3ui1HNb1TNU27fJReG7sMH7Lkn7J 1uCZ9e+gQaOu3cT3V8TbtUOvZNfR21VeHAdEKlNMzte0PvhUAqFhJpfGt+7p9y0WhR3S Zb/RzJag+4WKAQvANPQA2BiY02Z+byzUCnRHFABC2AFpMXkJwnlJBIGraci53082reLa NZU/8LkASYh2oOTXct5OWTAqBuB/nRhp4acseDutsOSl7eVmj2xHo+jF1lzGD1HZEqEF g3m5puNwava5IaFdMurKk0sD5DziIxRCcsfCo1NkE0ZrzCsiC5vixr7aKyxzb/ziSQep tD/A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=NnMy+nbb; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id d10-20020a056a0010ca00b005058bfb68ddsi2639548pfu.226.2022.04.15.14.47.17; Fri, 15 Apr 2022 14:47:32 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=NnMy+nbb; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1353643AbiDOMe0 (ORCPT + 99 others); Fri, 15 Apr 2022 08:34:26 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60010 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353828AbiDOMdX (ORCPT ); Fri, 15 Apr 2022 08:33:23 -0400 Received: from mail-ej1-x629.google.com (mail-ej1-x629.google.com [IPv6:2a00:1450:4864:20::629]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 130D7329A7; Fri, 15 Apr 2022 05:30:55 -0700 (PDT) Received: by mail-ej1-x629.google.com with SMTP id s18so15235618ejr.0; Fri, 15 Apr 2022 05:30:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Vf75TiqrDs9Xy+FgQuO5VDyKrFCIlVjIyCetakykwl0=; b=NnMy+nbbwu/FZGFdNgPth+OQJ2zH1oy44F8EuK/ZITnBseQ65d4wpQtYyU0GWr25lf XQOU3oOkIsiBEPEF0qJzEOKiAcQFaQgV/B68GaoszGIZ9qRO8CahbsqocqeYNB6NTSf6 PGQcvhwB2dpez64XytqOEnycrIB2/hxEQzdep6Pq7UZ0Yfcbc2F+JKZfTQqPlj3Jtul3 ZD6rIEnYrLwRkSx7G7k39+ga+AZCPgtZEXJb/lNtNcEVKFEi8Q5RMNq9uL2C76cNFGFD Pm2E5tfYntiCGIf2MdYfPhU68NY7qfzgH1P0qg8gQqJeLRI5zEJnKa6ny1SomEzEEscS ZYJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Vf75TiqrDs9Xy+FgQuO5VDyKrFCIlVjIyCetakykwl0=; b=P2YrtKYviMws5Zw0tnR5njDaZ+Pqjuf/lFKwPFHo4fC49rZtwzlaTvkX/4JwYn8EG4 iAWLjyDf3cIFxb/rwIWXU/AFhaS7BRv/ZNZcd9CWBUc3xNU6MkuUk6ileFHGN/lmNw0d rBsNYD7cN955yDkwfgUW80ka/Ysm8oWe80m8g4ijcVPV5e/db74sxNoGOfZzmTEA53qB 8CQsOfGC57HY5WNhbYnTZ+VItjf/6rOLFDhbNr2c90AdKgHy1vzTSGtHhXal58xz3wZr nTa8PoUVx6lRb83rxWjcbU43mv783mKn3IdGEdT2Ld8tIy83Tf5u6uXEp2erRvBLkinj MT4g== X-Gm-Message-State: AOAM531PqfnJOlsSBi1ZjsZ2jC4ZNrHR8aetev2l1zx7UnyXdFdbX3kK q1nFFwdX2JQb/LlTiedJ284= X-Received: by 2002:a17:906:7d83:b0:6ce:fee:9256 with SMTP id v3-20020a1709067d8300b006ce0fee9256mr6293515ejo.647.1650025853620; Fri, 15 Apr 2022 05:30:53 -0700 (PDT) Received: from localhost.localdomain (i130160.upc-i.chello.nl. [62.195.130.160]) by smtp.googlemail.com with ESMTPSA id bo14-20020a170906d04e00b006ce98d9c3e3sm1649533ejb.194.2022.04.15.05.30.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 Apr 2022 05:30:53 -0700 (PDT) From: Jakob Koschel To: "David S. Miller" Cc: Jakub Kicinski , Paolo Abeni , Andrew Lunn , Vivien Didelot , Florian Fainelli , Vladimir Oltean , Lars Povlsen , Steen Hegelund , UNGLinuxDriver@microchip.com, Ariel Elior , Manish Chopra , Edward Cree , Martin Habets , Michael Ellerman , Benjamin Herrenschmidt , Paul Mackerras , Jiri Pirko , Alexei Starovoitov , Daniel Borkmann , Andrii Nakryiko , Martin KaFai Lau , Song Liu , Yonghong Song , John Fastabend , KP Singh , Casper Andersson , Bjarni Jonasson , Jakob Koschel , Christophe JAILLET , Arnd Bergmann , Colin Ian King , Eric Dumazet , Xu Wang , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linuxppc-dev@lists.ozlabs.org, bpf@vger.kernel.org, Mike Rapoport , "Brian Johannesmeyer" , Cristiano Giuffrida , "Bos, H.J." , Vladimir Oltean Subject: [PATCH net-next v4 06/18] net: dsa: mv88e6xxx: refactor mv88e6xxx_port_vlan() Date: Fri, 15 Apr 2022 14:29:35 +0200 Message-Id: <20220415122947.2754662-7-jakobkoschel@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220415122947.2754662-1-jakobkoschel@gmail.com> References: <20220415122947.2754662-1-jakobkoschel@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Vladimir Oltean To avoid bugs and speculative execution exploits due to type-confused pointers at the end of a list_for_each_entry() loop, one measure is to restrict code to not use the iterator variable outside the loop block. In the case of mv88e6xxx_port_vlan(), this isn't a problem, as we never let the loops exit through "natural causes" anyway, by using a "found" variable and then using the last "dp" iterator prior to the break, which is a safe thing to do. Nonetheless, with the expected new syntax, this pattern will no longer be possible. Profit off of the occasion and break the two port finding methods into smaller sub-functions. Somehow, returning a copy of the iterator pointer is still accepted. This change makes it redundant to have a "bool found", since the "dp" from mv88e6xxx_port_vlan() now holds NULL if we haven't found what we were looking for. Signed-off-by: Vladimir Oltean Signed-off-by: Jakob Koschel --- drivers/net/dsa/mv88e6xxx/chip.c | 54 ++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c index b3aa0e5bc842..1f35e89053e6 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -1378,42 +1378,50 @@ static int mv88e6xxx_set_mac_eee(struct dsa_switch *ds, int port, return 0; } +static struct dsa_port *mv88e6xxx_find_port(struct dsa_switch_tree *dst, + int sw_index, int port) +{ + struct dsa_port *dp; + + list_for_each_entry(dp, &dst->ports, list) + if (dp->ds->index == sw_index && dp->index == port) + return dp; + + return NULL; +} + +static struct dsa_port * +mv88e6xxx_find_port_by_bridge_num(struct dsa_switch_tree *dst, + unsigned int bridge_num) +{ + struct dsa_port *dp; + + list_for_each_entry(dp, &dst->ports, list) + if (dsa_port_bridge_num_get(dp) == bridge_num) + return dp; + + return NULL; +} + /* Mask of the local ports allowed to receive frames from a given fabric port */ static u16 mv88e6xxx_port_vlan(struct mv88e6xxx_chip *chip, int dev, int port) { struct dsa_switch *ds = chip->ds; struct dsa_switch_tree *dst = ds->dst; struct dsa_port *dp, *other_dp; - bool found = false; u16 pvlan; - /* dev is a physical switch */ if (dev <= dst->last_switch) { - list_for_each_entry(dp, &dst->ports, list) { - if (dp->ds->index == dev && dp->index == port) { - /* dp might be a DSA link or a user port, so it - * might or might not have a bridge. - * Use the "found" variable for both cases. - */ - found = true; - break; - } - } - /* dev is a virtual bridge */ + /* dev is a physical switch */ + dp = mv88e6xxx_find_port(dst, dev, port); } else { - list_for_each_entry(dp, &dst->ports, list) { - unsigned int bridge_num = dsa_port_bridge_num_get(dp); - - if (bridge_num + dst->last_switch != dev) - continue; - - found = true; - break; - } + /* dev is a virtual bridge */ + dp = mv88e6xxx_find_port_by_bridge_num(dst, + dev - dst->last_switch); } /* Prevent frames from unknown switch or virtual bridge */ - if (!found) + if (!dp) return 0; /* Frames from DSA links and CPU ports can egress any local port */ -- 2.25.1