patch 'app/testpmd: fix out-of-bound reference in offload config' has been queued to stable release 22.11.8

luca.boccassi at gmail.com luca.boccassi at gmail.com
Fri Mar 7 13:24:05 CET 2025


Hi,

FYI, your patch has been queued to stable release 22.11.8

Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 03/09/25. So please
shout if anyone has objections.

Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.

Queued patches are on a temporary branch at:
https://github.com/bluca/dpdk-stable

This queued commit can be viewed at:
https://github.com/bluca/dpdk-stable/commit/6737b184aac935441fad1750704cd8e4eb7eed29

Thanks.

Luca Boccassi

---
>From 6737b184aac935441fad1750704cd8e4eb7eed29 Mon Sep 17 00:00:00 2001
From: Stephen Hemminger <stephen at networkplumber.org>
Date: Thu, 20 Feb 2025 12:44:26 -0800
Subject: [PATCH] app/testpmd: fix out-of-bound reference in offload config

[ upstream commit 8f847023dd16cb6e5858756d7ec16c940ac6eee9 ]

When configuring offloads, need to check the port id before
indexing into the ports[] array. This can easily be done
by moving the call to oh_dev_conf_get_print_err() to before
the checks for port stopped.

Fixes: c73a9071877a ("app/testpmd: add commands to test new offload API")

Signed-off-by: Stephen Hemminger <stephen at networkplumber.org>
Acked-by: Huisong Li <lihuisong at huawei.com>
---
 app/test-pmd/cmdline.c | 59 ++++++++++++++++++++++++++----------------
 1 file changed, 36 insertions(+), 23 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 90b501863c..b955803123 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -10921,7 +10921,7 @@ cmd_rx_offload_get_configuration_parsed(
 	struct cmd_rx_offload_get_configuration_result *res = parsed_result;
 	struct rte_eth_dev_info dev_info;
 	portid_t port_id = res->port_id;
-	struct rte_port *port = &ports[port_id];
+	struct rte_port *port;
 	struct rte_eth_conf dev_conf;
 	uint64_t port_offloads;
 	uint64_t queue_offloads;
@@ -10929,12 +10929,13 @@ cmd_rx_offload_get_configuration_parsed(
 	int q;
 	int ret;
 
+	ret = eth_dev_conf_get_print_err(port_id, &dev_conf);
+	if (ret != 0)
+		return;
+
+	port = &ports[port_id];
 	printf("Rx Offloading Configuration of port %d :\n", port_id);
 
-	ret = eth_dev_conf_get_print_err(port_id, &dev_conf);
-	if (ret != 0)
-		return;
-
 	port_offloads = dev_conf.rxmode.offloads;
 	printf("  Port :");
 	print_rx_offloads(port_offloads);
@@ -11039,12 +11040,17 @@ cmd_config_per_port_rx_offload_parsed(void *parsed_result,
 	struct cmd_config_per_port_rx_offload_result *res = parsed_result;
 	portid_t port_id = res->port_id;
 	struct rte_eth_dev_info dev_info;
-	struct rte_port *port = &ports[port_id];
+	struct rte_port *port;
 	uint64_t single_offload;
 	uint16_t nb_rx_queues;
 	int q;
 	int ret;
 
+	ret = eth_dev_info_get_print_err(port_id, &dev_info);
+	if (ret != 0)
+		return;
+
+	port = &ports[port_id];
 	if (port->port_status != RTE_PORT_STOPPED) {
 		fprintf(stderr,
 			"Error: Can't config offload when Port %d is not stopped\n",
@@ -11147,10 +11153,15 @@ cmd_config_per_queue_rx_offload_parsed(void *parsed_result,
 	struct rte_eth_dev_info dev_info;
 	portid_t port_id = res->port_id;
 	uint16_t queue_id = res->queue_id;
-	struct rte_port *port = &ports[port_id];
+	struct rte_port *port;
 	uint64_t single_offload;
 	int ret;
 
+	ret = eth_dev_info_get_print_err(port_id, &dev_info);
+	if (ret != 0)
+		return;
+
+	port = &ports[port_id];
 	if (port->port_status != RTE_PORT_STOPPED) {
 		fprintf(stderr,
 			"Error: Can't config offload when Port %d is not stopped\n",
@@ -11158,10 +11169,6 @@ cmd_config_per_queue_rx_offload_parsed(void *parsed_result,
 		return;
 	}
 
-	ret = eth_dev_info_get_print_err(port_id, &dev_info);
-	if (ret != 0)
-		return;
-
 	if (queue_id >= dev_info.nb_rx_queues) {
 		fprintf(stderr,
 			"Error: input queue_id should be 0 ... %d\n",
@@ -11340,7 +11347,7 @@ cmd_tx_offload_get_configuration_parsed(
 	struct cmd_tx_offload_get_configuration_result *res = parsed_result;
 	struct rte_eth_dev_info dev_info;
 	portid_t port_id = res->port_id;
-	struct rte_port *port = &ports[port_id];
+	struct rte_port *port;
 	struct rte_eth_conf dev_conf;
 	uint64_t port_offloads;
 	uint64_t queue_offloads;
@@ -11348,12 +11355,12 @@ cmd_tx_offload_get_configuration_parsed(
 	int q;
 	int ret;
 
+	ret = eth_dev_conf_get_print_err(port_id, &dev_conf);
+	if (ret != 0)
+		return;
+
 	printf("Tx Offloading Configuration of port %d :\n", port_id);
-
-	ret = eth_dev_conf_get_print_err(port_id, &dev_conf);
-	if (ret != 0)
-		return;
-
+	port = &ports[port_id];
 	port_offloads = dev_conf.txmode.offloads;
 	printf("  Port :");
 	print_tx_offloads(port_offloads);
@@ -11462,12 +11469,17 @@ cmd_config_per_port_tx_offload_parsed(void *parsed_result,
 	struct cmd_config_per_port_tx_offload_result *res = parsed_result;
 	portid_t port_id = res->port_id;
 	struct rte_eth_dev_info dev_info;
-	struct rte_port *port = &ports[port_id];
+	struct rte_port *port;
 	uint64_t single_offload;
 	uint16_t nb_tx_queues;
 	int q;
 	int ret;
 
+	ret = eth_dev_info_get_print_err(port_id, &dev_info);
+	if (ret != 0)
+		return;
+
+	port = &ports[port_id];
 	if (port->port_status != RTE_PORT_STOPPED) {
 		fprintf(stderr,
 			"Error: Can't config offload when Port %d is not stopped\n",
@@ -11573,10 +11585,15 @@ cmd_config_per_queue_tx_offload_parsed(void *parsed_result,
 	struct rte_eth_dev_info dev_info;
 	portid_t port_id = res->port_id;
 	uint16_t queue_id = res->queue_id;
-	struct rte_port *port = &ports[port_id];
+	struct rte_port *port;
 	uint64_t single_offload;
 	int ret;
 
+	ret = eth_dev_info_get_print_err(port_id, &dev_info);
+	if (ret != 0)
+		return;
+
+	port = &ports[port_id];
 	if (port->port_status != RTE_PORT_STOPPED) {
 		fprintf(stderr,
 			"Error: Can't config offload when Port %d is not stopped\n",
@@ -11584,10 +11601,6 @@ cmd_config_per_queue_tx_offload_parsed(void *parsed_result,
 		return;
 	}
 
-	ret = eth_dev_info_get_print_err(port_id, &dev_info);
-	if (ret != 0)
-		return;
-
 	if (queue_id >= dev_info.nb_tx_queues) {
 		fprintf(stderr,
 			"Error: input queue_id should be 0 ... %d\n",
-- 
2.47.2

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2025-03-07 12:23:38.254811139 +0000
+++ 0006-app-testpmd-fix-out-of-bound-reference-in-offload-co.patch	2025-03-07 12:23:37.998838059 +0000
@@ -1 +1 @@
-From 8f847023dd16cb6e5858756d7ec16c940ac6eee9 Mon Sep 17 00:00:00 2001
+From 6737b184aac935441fad1750704cd8e4eb7eed29 Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit 8f847023dd16cb6e5858756d7ec16c940ac6eee9 ]
+
@@ -12 +13,0 @@
-Cc: stable at dpdk.org
@@ -17,2 +18,2 @@
- app/test-pmd/cmdline.c | 67 +++++++++++++++++++++++-------------------
- 1 file changed, 36 insertions(+), 31 deletions(-)
+ app/test-pmd/cmdline.c | 59 ++++++++++++++++++++++++++----------------
+ 1 file changed, 36 insertions(+), 23 deletions(-)
@@ -21 +22 @@
-index 6ca3eedb92..d4bb3ec998 100644
+index 90b501863c..b955803123 100644
@@ -24 +25 @@
-@@ -11633,7 +11633,7 @@ cmd_rx_offload_get_configuration_parsed(
+@@ -10921,7 +10921,7 @@ cmd_rx_offload_get_configuration_parsed(
@@ -33 +34 @@
-@@ -11641,12 +11641,13 @@ cmd_rx_offload_get_configuration_parsed(
+@@ -10929,12 +10929,13 @@ cmd_rx_offload_get_configuration_parsed(
@@ -51,3 +52,3 @@
-@@ -11747,12 +11748,17 @@ static void
- config_port_rx_offload(portid_t port_id, char *name, bool on)
- {
+@@ -11039,12 +11040,17 @@ cmd_config_per_port_rx_offload_parsed(void *parsed_result,
+ 	struct cmd_config_per_port_rx_offload_result *res = parsed_result;
+ 	portid_t port_id = res->port_id;
@@ -56,0 +58 @@
+ 	uint64_t single_offload;
@@ -58 +59,0 @@
- 	uint64_t offload;
@@ -70,12 +71 @@
-@@ -11760,10 +11766,6 @@ config_port_rx_offload(portid_t port_id, char *name, bool on)
- 		return;
- 	}
- 
--	ret = eth_dev_info_get_print_err(port_id, &dev_info);
--	if (ret != 0)
--		return;
--
- 	if (!strcmp(name, "all")) {
- 		offload = dev_info.rx_offload_capa;
- 	} else {
-@@ -11949,10 +11951,15 @@ cmd_config_per_queue_rx_offload_parsed(void *parsed_result,
+@@ -11147,10 +11153,15 @@ cmd_config_per_queue_rx_offload_parsed(void *parsed_result,
@@ -87 +77 @@
- 	uint64_t offload;
+ 	uint64_t single_offload;
@@ -98 +88 @@
-@@ -11960,10 +11967,6 @@ cmd_config_per_queue_rx_offload_parsed(void *parsed_result,
+@@ -11158,10 +11169,6 @@ cmd_config_per_queue_rx_offload_parsed(void *parsed_result,
@@ -109 +99 @@
-@@ -12151,7 +12154,7 @@ cmd_tx_offload_get_configuration_parsed(
+@@ -11340,7 +11347,7 @@ cmd_tx_offload_get_configuration_parsed(
@@ -118 +108 @@
-@@ -12159,12 +12162,12 @@ cmd_tx_offload_get_configuration_parsed(
+@@ -11348,12 +11355,12 @@ cmd_tx_offload_get_configuration_parsed(
@@ -136,3 +126,3 @@
-@@ -12269,12 +12272,17 @@ static void
- config_port_tx_offload(portid_t port_id, char *name, bool on)
- {
+@@ -11462,12 +11469,17 @@ cmd_config_per_port_tx_offload_parsed(void *parsed_result,
+ 	struct cmd_config_per_port_tx_offload_result *res = parsed_result;
+ 	portid_t port_id = res->port_id;
@@ -141,0 +132 @@
+ 	uint64_t single_offload;
@@ -143 +133,0 @@
- 	uint64_t offload;
@@ -155,12 +145 @@
-@@ -12282,10 +12290,6 @@ config_port_tx_offload(portid_t port_id, char *name, bool on)
- 		return;
- 	}
- 
--	ret = eth_dev_info_get_print_err(port_id, &dev_info);
--	if (ret != 0)
--		return;
--
- 	if (!strcmp(name, "all")) {
- 		offload = dev_info.tx_offload_capa;
- 	} else {
-@@ -12475,10 +12479,15 @@ cmd_config_per_queue_tx_offload_parsed(void *parsed_result,
+@@ -11573,10 +11585,15 @@ cmd_config_per_queue_tx_offload_parsed(void *parsed_result,
@@ -172 +151 @@
- 	uint64_t offload;
+ 	uint64_t single_offload;
@@ -183 +162 @@
-@@ -12486,10 +12495,6 @@ cmd_config_per_queue_tx_offload_parsed(void *parsed_result,
+@@ -11584,10 +11601,6 @@ cmd_config_per_queue_tx_offload_parsed(void *parsed_result,


More information about the stable mailing list