From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from proxy.6wind.com (host.76.145.23.62.rev.coltfrance.com [62.23.145.76]) by dpdk.org (Postfix) with ESMTP id 658E1292D for ; Mon, 4 Apr 2016 17:46:02 +0200 (CEST) Received: from glumotte.dev.6wind.com (unknown [10.16.0.195]) by proxy.6wind.com (Postfix) with ESMTP id B11A525FB4; Mon, 4 Apr 2016 17:45:19 +0200 (CEST) From: Olivier Matz To: dev@dpdk.org Cc: john.mcnamara@intel.com Date: Mon, 4 Apr 2016 17:45:18 +0200 Message-Id: <1459784718-22856-1-git-send-email-olivier.matz@6wind.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: References: Subject: [dpdk-dev] [PATCH] xstats: fix behavior when a null array is provided X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 04 Apr 2016 15:46:02 -0000 Coverity reports an issue in ethdev: *** CID 124562: Null pointer dereferences (FORWARD_NULL) /lib/librte_ether/rte_ethdev.c: 1518 in rte_eth_xstats_get() 1512 1513 /* global stats */ 1514 for (i = 0; i < RTE_NB_STATS; i++) { 1515 stats_ptr = RTE_PTR_ADD(ð_stats, 1516 rte_stats_strings[i].offset); 1517 val = *stats_ptr; >>> CID 124562: Null pointer dereferences (FORWARD_NULL) >>> Dereferencing null pointer "xstats". 1518 snprintf(xstats[count].name, sizeof(xstats[count].name), 1519 "%s", rte_stats_strings[i].name); 1520 xstats[count++].value = val; 1521 } 1522 1523 /* per-rxq stats */ If a user calls rte_eth_xstats_get(portid, NULL, n) with n != 0, it may result in a crash. Although the API documentation says that n is the size of the table and xstats can be NULL if n == 0, we can add an additional check here to make Coverity happy. In that case, the return value is the same than when n == 0 is passed, it returns the number of statistics. Fixes: ce757f5c9a ("ethdev: new method to retrieve extended statistics") Signed-off-by: Olivier Matz --- lib/librte_ether/rte_ethdev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index 76a30fd..60d2573 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -1503,7 +1503,7 @@ rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstats *xstats, return xcount; } - if (n < count + xcount) + if (n < count + xcount || xstats == NULL) return count + xcount; /* now fill the xstats structure */ -- 2.1.4