[v2,04/44] net/pcap: fix segment fault when parse devargs

Message ID 20230320092110.37295-5-fengchengwen@huawei.com (mailing list archive)
State Changes Requested, archived
Delegated to: Thomas Monjalon
Headers
Series fix segment fault when parse args |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

fengchengwen March 20, 2023, 9:20 a.m. UTC
  The rte_kvargs_process() was used to parse KV pairs, it also supports
to parse 'only keys' (e.g. socket_id) type. And the callback function
parameter 'value' is NULL when parsed 'only keys'.

This patch fixes segment fault when parse input args with 'only keys'.

Fixes: 4c173302c307 ("pcap: add new driver")
Fixes: 53bf48403409 ("net/pcap: capture only ingress packets from Rx iface")
Fixes: c9507cd0cada ("net/pcap: support physical interface MAC address")
Fixes: a3f5252e5cbd ("net/pcap: enable infinitely Rx a pcap file")
Cc: stable@dpdk.org

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
---
 drivers/net/pcap/pcap_ethdev.c | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)
  

Comments

Stephen Hemminger July 4, 2023, 3:04 a.m. UTC | #1
On Mon, 20 Mar 2023 09:20:30 +0000
Chengwen Feng <fengchengwen@huawei.com> wrote:

> The rte_kvargs_process() was used to parse KV pairs, it also supports
> to parse 'only keys' (e.g. socket_id) type. And the callback function
> parameter 'value' is NULL when parsed 'only keys'.
> 
> This patch fixes segment fault when parse input args with 'only keys'.
> 
> Fixes: 4c173302c307 ("pcap: add new driver")
> Fixes: 53bf48403409 ("net/pcap: capture only ingress packets from Rx iface")
> Fixes: c9507cd0cada ("net/pcap: support physical interface MAC address")
> Fixes: a3f5252e5cbd ("net/pcap: enable infinitely Rx a pcap file")
> Cc: stable@dpdk.org
> 
> Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>

Acked-by: Stephen Hemminger <stephen@networkplumber.org>
  

Patch

diff --git a/drivers/net/pcap/pcap_ethdev.c b/drivers/net/pcap/pcap_ethdev.c
index bfec085045..9dc66e7ee9 100644
--- a/drivers/net/pcap/pcap_ethdev.c
+++ b/drivers/net/pcap/pcap_ethdev.c
@@ -1034,6 +1034,9 @@  open_rx_pcap(const char *key, const char *value, void *extra_args)
 	struct pmd_devargs *rx = extra_args;
 	pcap_t *pcap = NULL;
 
+	if (value == NULL)
+		return -EINVAL;
+
 	if (open_single_rx_pcap(pcap_filename, &pcap) < 0)
 		return -1;
 
@@ -1056,6 +1059,9 @@  open_tx_pcap(const char *key, const char *value, void *extra_args)
 	struct pmd_devargs *dumpers = extra_args;
 	pcap_dumper_t *dumper;
 
+	if (value == NULL)
+		return -EINVAL;
+
 	if (open_single_tx_pcap(pcap_filename, &dumper) < 0)
 		return -1;
 
@@ -1077,6 +1083,9 @@  open_rx_tx_iface(const char *key, const char *value, void *extra_args)
 	struct pmd_devargs *tx = extra_args;
 	pcap_t *pcap = NULL;
 
+	if (value == NULL)
+		return -EINVAL;
+
 	if (open_single_iface(iface, &pcap) < 0)
 		return -1;
 
@@ -1143,6 +1152,9 @@  open_rx_iface(const char *key, const char *value, void *extra_args)
 static inline int
 rx_iface_args_process(const char *key, const char *value, void *extra_args)
 {
+	if (value == NULL)
+		return -EINVAL;
+
 	if (strcmp(key, ETH_PCAP_RX_IFACE_ARG) == 0 ||
 			strcmp(key, ETH_PCAP_RX_IFACE_IN_ARG) == 0)
 		return open_rx_iface(key, value, extra_args);
@@ -1156,6 +1168,8 @@  rx_iface_args_process(const char *key, const char *value, void *extra_args)
 static int
 open_tx_iface(const char *key, const char *value, void *extra_args)
 {
+	if (value == NULL)
+		return -EINVAL;
 	return open_iface(key, value, extra_args);
 }
 
@@ -1163,7 +1177,7 @@  static int
 select_phy_mac(const char *key __rte_unused, const char *value,
 		void *extra_args)
 {
-	if (extra_args) {
+	if (value != NULL && extra_args != NULL) {
 		const int phy_mac = atoi(value);
 		int *enable_phy_mac = extra_args;
 
@@ -1177,7 +1191,7 @@  static int
 get_infinite_rx_arg(const char *key __rte_unused,
 		const char *value, void *extra_args)
 {
-	if (extra_args) {
+	if (value != NULL && extra_args != NULL) {
 		const int infinite_rx = atoi(value);
 		int *enable_infinite_rx = extra_args;