Received: by 2002:a05:6a10:83d0:0:0:0:0 with SMTP id o16csp225347pxh; Thu, 7 Apr 2022 19:50:47 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxZICRuzpDvQgjQXF/30GyFecywlFEgPzHNcIbE+lF4hyqsvKc9417igCP8cWEfR6hiVMS7 X-Received: by 2002:a05:6a00:1310:b0:4ca:cc46:20c7 with SMTP id j16-20020a056a00131000b004cacc4620c7mr17320703pfu.44.1649386247314; Thu, 07 Apr 2022 19:50:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649386247; cv=none; d=google.com; s=arc-20160816; b=EFFh59zef/va/kbP2MJGNgOm2P5OONVRvaI0OF2Wqo+zgXbw08876AaFUHtXoxDFR4 7MlhMX1XyOwsknDNVIMNELoVGIg6McExGEWSB5OywxGeErPGCGPoHu7nqRnBnK+bnnJ3 0dKbqI6BwjDcDZH7QbDUDXajRrzwAteKJt1LWC9DO6sKeSiQ1G0ALY0QWjU+iU1CDk4L XyThYqoZyl3iDBPK91JCOHQW+ym4UndJn7Jt51qX1hbeXfpCCImRdIA2mLGYDI7snCCX mlVRLX4X//aHe8NfUSPTYGtJCq9H61pNMu2aX2jKmlwtvCABl/OMpbWzgxJMVdhbX4h1 bWfw== 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 :message-id:date:subject:cc:to:from:dkim-signature; bh=lBACXjWX5t9m7/YBtD+SdjykCib7p99sPoxBlhbIOjc=; b=dTtaotGLBUUPGvPpuZ9Z94ORHnFLYwmA0uBwPwgivKcaMmIA6qysGR92tcF7U2rgoj JWTjjWn8XgSSNaJTp1fyKckn7Kr7e6NHWehUwHfzoRUbvzDeNH2HvSHhCsQ2bqGnZybC 3j9pHQjZRMyHxDtHvgGvd0ZYK4AOL6nDL+BThU/fwt0ucvbQh1r7XJDfJbl0NbZCk4dU 4/MbOTTNL27AGQsjPZC2vTnMKnXRjzmWDTVq+uF88AbMtYHuHaosnHOO2xMen3aj68ic rf1OdlTeW/Ducf0MKA8y028qPIxugpf3p4PcAqu507wqpkWZn7W1YSTzFfzHoVluXxGF Mi/w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@canonical.com header.s=20210705 header.b=mICAlcz9; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=canonical.com Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id s10-20020a170902ea0a00b00153b2d16443si1693438plg.75.2022.04.07.19.50.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 Apr 2022 19:50:47 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; dkim=pass header.i=@canonical.com header.s=20210705 header.b=mICAlcz9; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=canonical.com Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 2F16D2B5EC6; Thu, 7 Apr 2022 19:23:09 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233737AbiDHCZF (ORCPT + 99 others); Thu, 7 Apr 2022 22:25:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49208 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233727AbiDHCZE (ORCPT ); Thu, 7 Apr 2022 22:25:04 -0400 Received: from smtp-relay-canonical-1.canonical.com (smtp-relay-canonical-1.canonical.com [185.125.188.121]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1D9921544B9; Thu, 7 Apr 2022 19:23:01 -0700 (PDT) Received: from localhost.localdomain (unknown [10.101.196.174]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-canonical-1.canonical.com (Postfix) with ESMTPSA id C48533F611; Fri, 8 Apr 2022 02:22:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1649384574; bh=lBACXjWX5t9m7/YBtD+SdjykCib7p99sPoxBlhbIOjc=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=mICAlcz9/w/kHZ/ygvqU6BkXbySDJG47Xa1Z39iYfPYljUa2LyN7bkY03Q13WSt1w 5F1A3d6AYvUEH+n/NBGRDLP2ySfdXimMHkkcJwo2lEK71WKyVuVfExs7ByCwQZ/W32 4pIOthejaYuXZW1O/y996uXkhN2bK7f2yzXXyhN/FTfCItgjZTYHFnUJUzOWJF1jz0 eSo8QpJvFWQ/jWK1B4xNlSZikrFFbGCuh8KApaLAynFfecIaUlivXzGLS6w/riDHfV cQ/qnh01+hKXt7QOgEVdcBYFEQJEHG9e+Wb+1NBtWK3wr4sux3wq+s/bCbTv1vGhUA 9vWg8P4r+BEvA== From: Kai-Heng Feng To: irusskikh@marvell.com, davem@davemloft.net, kuba@kernel.org Cc: Kai-Heng Feng , Mario Limonciello , Paolo Abeni , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2] net: atlantic: Avoid out-of-bounds indexing Date: Fri, 8 Apr 2022 10:22:04 +0800 Message-Id: <20220408022204.16815-1-kai.heng.feng@canonical.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE, URIBL_BLOCKED autolearn=no 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 UBSAN warnings are observed on atlantic driver: [ 294.432996] UBSAN: array-index-out-of-bounds in /build/linux-Qow4fL/linux-5.15.0/drivers/net/ethernet/aquantia/atlantic/aq_nic.c:484:48 [ 294.433695] index 8 is out of range for type 'aq_vec_s *[8]' The ring is dereferenced right before breaking out the loop, to prevent that from happening, only use the index in the loop to fix the issue. BugLink: https://bugs.launchpad.net/bugs/1958770 Tested-by: Mario Limonciello Signed-off-by: Kai-Heng Feng --- v2: - Change the idiosyncrasy in both aq_nic.c and aq_vec.c. - Wording change. .../net/ethernet/aquantia/atlantic/aq_nic.c | 8 +++---- .../net/ethernet/aquantia/atlantic/aq_vec.c | 24 +++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c index 33f1a1377588b..24d715c28a355 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c @@ -486,8 +486,8 @@ int aq_nic_start(struct aq_nic_s *self) if (err < 0) goto err_exit; - for (i = 0U, aq_vec = self->aq_vec[0]; - self->aq_vecs > i; ++i, aq_vec = self->aq_vec[i]) { + for (i = 0U; self->aq_vecs > i; ++i) { + aq_vec = self->aq_vec[i]; err = aq_vec_start(aq_vec); if (err < 0) goto err_exit; @@ -517,8 +517,8 @@ int aq_nic_start(struct aq_nic_s *self) mod_timer(&self->polling_timer, jiffies + AQ_CFG_POLLING_TIMER_INTERVAL); } else { - for (i = 0U, aq_vec = self->aq_vec[0]; - self->aq_vecs > i; ++i, aq_vec = self->aq_vec[i]) { + for (i = 0U; self->aq_vecs > i; ++i) { + aq_vec = self->aq_vec[i]; err = aq_pci_func_alloc_irq(self, i, self->ndev->name, aq_vec_isr, aq_vec, aq_vec_get_affinity_mask(aq_vec)); diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_vec.c b/drivers/net/ethernet/aquantia/atlantic/aq_vec.c index f4774cf051c97..6ab1f3212d246 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_vec.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_vec.c @@ -43,8 +43,8 @@ static int aq_vec_poll(struct napi_struct *napi, int budget) if (!self) { err = -EINVAL; } else { - for (i = 0U, ring = self->ring[0]; - self->tx_rings > i; ++i, ring = self->ring[i]) { + for (i = 0U; self->tx_rings > i; ++i) { + ring = self->ring[i]; u64_stats_update_begin(&ring[AQ_VEC_RX_ID].stats.rx.syncp); ring[AQ_VEC_RX_ID].stats.rx.polls++; u64_stats_update_end(&ring[AQ_VEC_RX_ID].stats.rx.syncp); @@ -182,8 +182,8 @@ int aq_vec_init(struct aq_vec_s *self, const struct aq_hw_ops *aq_hw_ops, self->aq_hw_ops = aq_hw_ops; self->aq_hw = aq_hw; - for (i = 0U, ring = self->ring[0]; - self->tx_rings > i; ++i, ring = self->ring[i]) { + for (i = 0U; self->tx_rings > i; ++i) { + ring = self->ring[i]; err = aq_ring_init(&ring[AQ_VEC_TX_ID], ATL_RING_TX); if (err < 0) goto err_exit; @@ -224,8 +224,8 @@ int aq_vec_start(struct aq_vec_s *self) unsigned int i = 0U; int err = 0; - for (i = 0U, ring = self->ring[0]; - self->tx_rings > i; ++i, ring = self->ring[i]) { + for (i = 0U; self->tx_rings > i; ++i) { + ring = self->ring[i]; err = self->aq_hw_ops->hw_ring_tx_start(self->aq_hw, &ring[AQ_VEC_TX_ID]); if (err < 0) @@ -248,8 +248,8 @@ void aq_vec_stop(struct aq_vec_s *self) struct aq_ring_s *ring = NULL; unsigned int i = 0U; - for (i = 0U, ring = self->ring[0]; - self->tx_rings > i; ++i, ring = self->ring[i]) { + for (i = 0U; self->tx_rings > i; ++i) { + ring = self->ring[i]; self->aq_hw_ops->hw_ring_tx_stop(self->aq_hw, &ring[AQ_VEC_TX_ID]); @@ -268,8 +268,8 @@ void aq_vec_deinit(struct aq_vec_s *self) if (!self) goto err_exit; - for (i = 0U, ring = self->ring[0]; - self->tx_rings > i; ++i, ring = self->ring[i]) { + for (i = 0U; self->tx_rings > i; ++i) { + ring = self->ring[i]; aq_ring_tx_clean(&ring[AQ_VEC_TX_ID]); aq_ring_rx_deinit(&ring[AQ_VEC_RX_ID]); } @@ -297,8 +297,8 @@ void aq_vec_ring_free(struct aq_vec_s *self) if (!self) goto err_exit; - for (i = 0U, ring = self->ring[0]; - self->tx_rings > i; ++i, ring = self->ring[i]) { + for (i = 0U; self->tx_rings > i; ++i) { + ring = self->ring[i]; aq_ring_free(&ring[AQ_VEC_TX_ID]); if (i < self->rx_rings) aq_ring_free(&ring[AQ_VEC_RX_ID]); -- 2.34.1