From cf1c50e31194f73cd6800b86cc4f0df6db9bc05f Mon Sep 17 00:00:00 2001 From: chenjiji09 Date: Thu, 27 Apr 2023 15:25:46 +0800 Subject: [PATCH] fix empty devargs parsing Sync some patchs from upstreaming and modifies are as follow: 1. The rte_kvargs_process() was used to parse KV pairs, it also supports to parse 'only keys' 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'. 2. The MAP_FAILED should be used to determine whether the mapping is successful but not NULL. This patch fix it. (cherry picked from commit dfaed15bf9253e6b71dda7639806c0b265164a9e) --- 0277-mem-fix-hugepage-info-mapping.patch | 51 +++++++++++++++ ...pga-base-fix-init-with-multi-process.patch | 44 +++++++++++++ ...ompressdev-fix-empty-devargs-parsing.patch | 52 ++++++++++++++++ ...-cryptodev-fix-empty-devargs-parsing.patch | 55 ++++++++++++++++ 0281-net-hns3-fix-empty-devargs-parsing.patch | 62 +++++++++++++++++++ ...net-virtio-fix-empty-devargs-parsing.patch | 57 +++++++++++++++++ ...a-skeleton-fix-empty-devargs-parsing.patch | 46 ++++++++++++++ ...w-skeleton-fix-empty-devargs-parsing.patch | 38 ++++++++++++ dpdk.spec | 22 ++++++- 9 files changed, 426 insertions(+), 1 deletion(-) create mode 100644 0277-mem-fix-hugepage-info-mapping.patch create mode 100644 0278-raw-ifpga-base-fix-init-with-multi-process.patch create mode 100644 0279-compressdev-fix-empty-devargs-parsing.patch create mode 100644 0280-cryptodev-fix-empty-devargs-parsing.patch create mode 100644 0281-net-hns3-fix-empty-devargs-parsing.patch create mode 100644 0282-net-virtio-fix-empty-devargs-parsing.patch create mode 100644 0283-dma-skeleton-fix-empty-devargs-parsing.patch create mode 100644 0284-raw-skeleton-fix-empty-devargs-parsing.patch diff --git a/0277-mem-fix-hugepage-info-mapping.patch b/0277-mem-fix-hugepage-info-mapping.patch new file mode 100644 index 0000000..c7c302b --- /dev/null +++ b/0277-mem-fix-hugepage-info-mapping.patch @@ -0,0 +1,51 @@ +From 2d42f6d26a83262c9765c6db7dfca44c8c26d995 Mon Sep 17 00:00:00 2001 +From: Chengwen Feng +Date: Mon, 6 Feb 2023 10:53:10 +0000 +Subject: mem: fix hugepage info mapping + +[ upstream commit 66e7ac416f3d62c5ee773ff02c115a24da9f1991 ] + +The map_shared_memory() function should treat mmap MAP_FAILED as NULL +because callers compare it with NULL to determine whether the map is +failed. + +Fixes: 764bf26873b9 ("add FreeBSD support") +Fixes: cb97d93e9d3b ("mem: share hugepage info primary and secondary") +Cc: stable@dpdk.org + +Signed-off-by: Chengwen Feng +Reviewed-by: David Marchand +--- + lib/eal/freebsd/eal_hugepage_info.c | 2 +- + lib/eal/linux/eal_hugepage_info.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/lib/eal/freebsd/eal_hugepage_info.c b/lib/eal/freebsd/eal_hugepage_info.c +index 9dbe375bd3..e58e618469 100644 +--- a/lib/eal/freebsd/eal_hugepage_info.c ++++ b/lib/eal/freebsd/eal_hugepage_info.c +@@ -33,7 +33,7 @@ map_shared_memory(const char *filename, const size_t mem_size, int flags) + } + retval = mmap(NULL, mem_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + close(fd); +- return retval; ++ return retval == MAP_FAILED ? NULL : retval; + } + + static void * +diff --git a/lib/eal/linux/eal_hugepage_info.c b/lib/eal/linux/eal_hugepage_info.c +index 41acf180ee..6c76a36a0d 100644 +--- a/lib/eal/linux/eal_hugepage_info.c ++++ b/lib/eal/linux/eal_hugepage_info.c +@@ -57,7 +57,7 @@ map_shared_memory(const char *filename, const size_t mem_size, int flags) + retval = mmap(NULL, mem_size, PROT_READ | PROT_WRITE, + MAP_SHARED, fd, 0); + close(fd); +- return retval; ++ return retval == MAP_FAILED ? NULL : retval; + } + + static void * +-- +2.23.0 + diff --git a/0278-raw-ifpga-base-fix-init-with-multi-process.patch b/0278-raw-ifpga-base-fix-init-with-multi-process.patch new file mode 100644 index 0000000..d5d7ab9 --- /dev/null +++ b/0278-raw-ifpga-base-fix-init-with-multi-process.patch @@ -0,0 +1,44 @@ +From 08ad2bc6e7fd4bc11b25011dbae48268828d372f Mon Sep 17 00:00:00 2001 +From: Chengwen Feng +Date: Mon, 6 Feb 2023 10:53:11 +0000 +Subject: raw/ifpga/base: fix init with multi-process + +[ upstream commit e6a2804b77c5fbfd97d0fe05ec7f959a0404a380 ] + +The MAP_FAILED should be used to determine whether the mapping is +successful. + +Fixes: e41856b515ce ("raw/ifpga/base: enhance driver reliability in multi-process") +Cc: stable@dpdk.org + +Signed-off-by: Chengwen Feng +Reviewed-by: Rosen Xu +--- + drivers/raw/ifpga/base/opae_hw_api.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/raw/ifpga/base/opae_hw_api.c b/drivers/raw/ifpga/base/opae_hw_api.c +index 11c9887c7f..45efe70473 100644 +--- a/drivers/raw/ifpga/base/opae_hw_api.c ++++ b/drivers/raw/ifpga/base/opae_hw_api.c +@@ -380,7 +380,7 @@ static pthread_mutex_t *opae_adapter_mutex_open(struct opae_adapter *adapter) + PROT_READ | PROT_WRITE, MAP_SHARED, + shm_id, 0); + adapter->lock = (pthread_mutex_t *)ptr; +- if (ptr) { ++ if (ptr != MAP_FAILED) { + dev_info(NULL, + "shared memory %s address is %p\n", + shm_name, ptr); +@@ -499,7 +499,7 @@ static void *opae_adapter_shm_alloc(struct opae_adapter *adapter) + adapter->shm.size = size; + adapter->shm.ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, + MAP_SHARED, shm_id, 0); +- if (adapter->shm.ptr) { ++ if (adapter->shm.ptr != MAP_FAILED) { + dev_info(NULL, + "shared memory %s address is %p\n", + shm_name, adapter->shm.ptr); +-- +2.23.0 + diff --git a/0279-compressdev-fix-empty-devargs-parsing.patch b/0279-compressdev-fix-empty-devargs-parsing.patch new file mode 100644 index 0000000..d42e29d --- /dev/null +++ b/0279-compressdev-fix-empty-devargs-parsing.patch @@ -0,0 +1,52 @@ +From 37b765efbca81e4aa81fcb685e7810398e800e29 Mon Sep 17 00:00:00 2001 +From: Chengwen Feng +Date: Thu, 2 Mar 2023 07:50:05 +0000 +Subject: compressdev: fix empty devargs parsing + +[ upstream commit bb27182482d61777de6a38b16a1d2c692c2c3f8b ] + +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 in rte_compressdev_pmd_parse_uint_arg() +when parse input args with 'only keys' (e.g. socket_id). + +For a similar reason, this patch fixes +rte_compressdev_pmd_parse_name_arg(). + +Fixes: ed7dd94f7f66 ("compressdev: add basic device management") +Cc: stable@dpdk.org + +Signed-off-by: Chengwen Feng +--- + lib/compressdev/rte_compressdev_pmd.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/lib/compressdev/rte_compressdev_pmd.c b/lib/compressdev/rte_compressdev_pmd.c +index 7f500d76d4..6a11a396b7 100644 +--- a/lib/compressdev/rte_compressdev_pmd.c ++++ b/lib/compressdev/rte_compressdev_pmd.c +@@ -20,6 +20,9 @@ rte_compressdev_pmd_parse_name_arg(const char *key __rte_unused, + struct rte_compressdev_pmd_init_params *params = extra_args; + int n; + ++ if (value == NULL || extra_args == NULL) ++ return -EINVAL; ++ + n = strlcpy(params->name, value, RTE_COMPRESSDEV_NAME_MAX_LEN); + if (n >= RTE_COMPRESSDEV_NAME_MAX_LEN) + return -EINVAL; +@@ -37,6 +40,9 @@ rte_compressdev_pmd_parse_uint_arg(const char *key __rte_unused, + int i; + char *end; + ++ if (value == NULL || extra_args == NULL) ++ return -EINVAL; ++ + errno = 0; + i = strtol(value, &end, 10); + if (*end != 0 || errno != 0 || i < 0) +-- +2.23.0 + diff --git a/0280-cryptodev-fix-empty-devargs-parsing.patch b/0280-cryptodev-fix-empty-devargs-parsing.patch new file mode 100644 index 0000000..9e9f0ea --- /dev/null +++ b/0280-cryptodev-fix-empty-devargs-parsing.patch @@ -0,0 +1,55 @@ +From 23320d21b4abc8f52c612768a8508443f77dfcd8 Mon Sep 17 00:00:00 2001 +From: Chengwen Feng +Date: Thu, 2 Mar 2023 07:50:07 +0000 +Subject: cryptodev: fix empty devargs parsing + +[ upstream commit 8146454c56636ba8af5263b57e1c4a9f67fd4a39 ] + +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 in rte_cryptodev_pmd_parse_uint_arg() +when parse input args with 'only keys' (e.g. socket_id, +max_nb_queue_pairs). + +For a similar reason, this patch fixes +rte_cryptodev_pmd_parse_name_arg(). + +Fixes: 9e6edea41805 ("cryptodev: add APIs to assist PMD initialisation") +Cc: stable@dpdk.org + +Signed-off-by: Chengwen Feng +Acked-by: Akhil Goyal +--- + lib/cryptodev/cryptodev_pmd.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/lib/cryptodev/cryptodev_pmd.c b/lib/cryptodev/cryptodev_pmd.c +index 739a0b3f34..9dab1ef7cd 100644 +--- a/lib/cryptodev/cryptodev_pmd.c ++++ b/lib/cryptodev/cryptodev_pmd.c +@@ -19,6 +19,9 @@ rte_cryptodev_pmd_parse_name_arg(const char *key __rte_unused, + struct rte_cryptodev_pmd_init_params *params = extra_args; + int n; + ++ if (value == NULL || extra_args == NULL) ++ return -EINVAL; ++ + n = strlcpy(params->name, value, RTE_CRYPTODEV_NAME_MAX_LEN); + if (n >= RTE_CRYPTODEV_NAME_MAX_LEN) + return -EINVAL; +@@ -35,6 +38,10 @@ rte_cryptodev_pmd_parse_uint_arg(const char *key __rte_unused, + { + int i; + char *end; ++ ++ if (value == NULL || extra_args == NULL) ++ return -EINVAL; ++ + errno = 0; + + i = strtol(value, &end, 10); +-- +2.23.0 + diff --git a/0281-net-hns3-fix-empty-devargs-parsing.patch b/0281-net-hns3-fix-empty-devargs-parsing.patch new file mode 100644 index 0000000..84791c6 --- /dev/null +++ b/0281-net-hns3-fix-empty-devargs-parsing.patch @@ -0,0 +1,62 @@ +From cd1064bf44f8da3286a48f3f3da7df88ae4fa645 Mon Sep 17 00:00:00 2001 +From: Chengwen Feng +Date: Thu, 2 Mar 2023 07:50:09 +0000 +Subject: net/hns3: fix empty devargs parsing + +[ upstream commit 8e9bd29995ddb1205d90291a684bcf71599d6623 ] + +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' +(e.g. rx_func_hint). + +Fixes: a124f9e9591b ("net/hns3: add runtime config to select IO burst function") +Fixes: 70791213242e ("net/hns3: support masking device capability") +Fixes: 2fc3e696a7f1 ("net/hns3: add runtime config for mailbox limit time") +Cc: stable@dpdk.org + +Signed-off-by: Chengwen Feng +Acked-by: Dongdong Liu +--- + drivers/net/hns3/hns3_common.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/drivers/net/hns3/hns3_common.c b/drivers/net/hns3/hns3_common.c +index 3c5e07f1bd..6697ecefe6 100644 +--- a/drivers/net/hns3/hns3_common.c ++++ b/drivers/net/hns3/hns3_common.c +@@ -161,6 +161,9 @@ hns3_parse_io_hint_func(const char *key, const char *value, void *extra_args) + + RTE_SET_USED(key); + ++ if (value == NULL || extra_args == NULL) ++ return 0; ++ + if (strcmp(value, "vec") == 0) + hint = HNS3_IO_FUNC_HINT_VEC; + else if (strcmp(value, "sve") == 0) +@@ -201,6 +204,9 @@ hns3_parse_dev_caps_mask(const char *key, const char *value, void *extra_args) + + RTE_SET_USED(key); + ++ if (value == NULL || extra_args == NULL) ++ return 0; ++ + val = strtoull(value, NULL, HNS3_CONVERT_TO_HEXADECIMAL); + *(uint64_t *)extra_args = val; + +@@ -214,6 +220,9 @@ hns3_parse_mbx_time_limit(const char *key, const char *value, void *extra_args) + + RTE_SET_USED(key); + ++ if (value == NULL || extra_args == NULL) ++ return 0; ++ + val = strtoul(value, NULL, HNS3_CONVERT_TO_DECIMAL); + + /* +-- +2.23.0 + diff --git a/0282-net-virtio-fix-empty-devargs-parsing.patch b/0282-net-virtio-fix-empty-devargs-parsing.patch new file mode 100644 index 0000000..dafb867 --- /dev/null +++ b/0282-net-virtio-fix-empty-devargs-parsing.patch @@ -0,0 +1,57 @@ +From 51a50c25f5884df574cb254ee92de23bc821c0b4 Mon Sep 17 00:00:00 2001 +From: Chengwen Feng +Date: Thu, 2 Mar 2023 07:50:10 +0000 +Subject: net/virtio: fix empty devargs parsing + +[ upstream commit 1c1b35b59b4cee8836f34498b7c55b49de39d7b3 ] + +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' +(e.g. vectorized,vdpa). + +Fixes: 4710e16a4a7b ("net/virtio: add parameter to enable vectorized path") +Fixes: 44d7b2e87b69 ("net/virtio: refactor devargs parsing") +Fixes: 440f03c25378 ("net/virtio: skip device probe in vDPA mode") +Cc: stable@dpdk.org + +Signed-off-by: Chengwen Feng +Reviewed-by: Maxime Coquelin +--- + drivers/net/virtio/virtio_ethdev.c | 3 +++ + drivers/net/virtio/virtio_pci_ethdev.c | 3 +++ + 2 files changed, 6 insertions(+) + +diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c +index a38b15d01c..c22b2f2889 100644 +--- a/drivers/net/virtio/virtio_ethdev.c ++++ b/drivers/net/virtio/virtio_ethdev.c +@@ -2474,6 +2474,9 @@ virtio_dev_speed_capa_get(uint32_t speed) + static int vectorized_check_handler(__rte_unused const char *key, + const char *value, void *ret_val) + { ++ if (value == NULL || ret_val == NULL) ++ return -EINVAL; ++ + if (strcmp(value, "1") == 0) + *(int *)ret_val = 1; + else +diff --git a/drivers/net/virtio/virtio_pci_ethdev.c b/drivers/net/virtio/virtio_pci_ethdev.c +index 54645dc62e..de7b1ef344 100644 +--- a/drivers/net/virtio/virtio_pci_ethdev.c ++++ b/drivers/net/virtio/virtio_pci_ethdev.c +@@ -138,6 +138,9 @@ eth_virtio_pci_uninit(struct rte_eth_dev *eth_dev) + static int vdpa_check_handler(__rte_unused const char *key, + const char *value, void *ret_val) + { ++ if (value == NULL || ret_val == NULL) ++ return -EINVAL; ++ + if (strcmp(value, "1") == 0) + *(int *)ret_val = 1; + else +-- +2.23.0 + diff --git a/0283-dma-skeleton-fix-empty-devargs-parsing.patch b/0283-dma-skeleton-fix-empty-devargs-parsing.patch new file mode 100644 index 0000000..61664ec --- /dev/null +++ b/0283-dma-skeleton-fix-empty-devargs-parsing.patch @@ -0,0 +1,46 @@ +From 9db4a191823cb2dec68c4be50bb1143c141da22c Mon Sep 17 00:00:00 2001 +From: Chengwen Feng +Date: Thu, 2 Mar 2023 07:50:11 +0000 +Subject: dma/skeleton: fix empty devargs parsing + +[ upstream commit e0e5dd0450db22fc7712da4b5a8e6fd6e081c870 ] + +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' +(e.g. lcore). + +Fixes: 05d5fc66a269 ("dma/skeleton: introduce skeleton driver") +Cc: stable@dpdk.org + +Signed-off-by: Chengwen Feng +--- + drivers/dma/skeleton/skeleton_dmadev.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/drivers/dma/skeleton/skeleton_dmadev.c b/drivers/dma/skeleton/skeleton_dmadev.c +index 81cbdd286e..67e0357cf0 100644 +--- a/drivers/dma/skeleton/skeleton_dmadev.c ++++ b/drivers/dma/skeleton/skeleton_dmadev.c +@@ -500,9 +500,15 @@ skeldma_parse_lcore(const char *key __rte_unused, + const char *value, + void *opaque) + { +- int lcore_id = atoi(value); ++ int lcore_id; ++ ++ if (value == NULL || opaque == NULL) ++ return -EINVAL; ++ ++ lcore_id = atoi(value); + if (lcore_id >= 0 && lcore_id < RTE_MAX_LCORE) + *(int *)opaque = lcore_id; ++ + return 0; + } + +-- +2.23.0 + diff --git a/0284-raw-skeleton-fix-empty-devargs-parsing.patch b/0284-raw-skeleton-fix-empty-devargs-parsing.patch new file mode 100644 index 0000000..4a67dc6 --- /dev/null +++ b/0284-raw-skeleton-fix-empty-devargs-parsing.patch @@ -0,0 +1,38 @@ +From db5368482035c920449a75d336afd3622044ee89 Mon Sep 17 00:00:00 2001 +From: Chengwen Feng +Date: Thu, 2 Mar 2023 07:50:12 +0000 +Subject: raw/skeleton: fix empty devargs parsing + +[ upstream commit 11da6149224a8de53d2ddd2aacba7b158cc4e3b4 ] + +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' +(e.g. self_test). + +Fixes: 55ca1b0f2151 ("raw/skeleton: add test cases") +Cc: stable@dpdk.org + +Signed-off-by: Chengwen Feng +--- + drivers/raw/skeleton/skeleton_rawdev.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/raw/skeleton/skeleton_rawdev.c b/drivers/raw/skeleton/skeleton_rawdev.c +index 16ecae3d92..a49e000146 100644 +--- a/drivers/raw/skeleton/skeleton_rawdev.c ++++ b/drivers/raw/skeleton/skeleton_rawdev.c +@@ -659,6 +659,8 @@ skeldev_get_selftest(const char *key __rte_unused, + void *opaque) + { + int *flag = opaque; ++ if (value == NULL || opaque == NULL) ++ return -EINVAL; + *flag = atoi(value); + return 0; + } +-- +2.23.0 + diff --git a/dpdk.spec b/dpdk.spec index ca50816..0680ac2 100644 --- a/dpdk.spec +++ b/dpdk.spec @@ -1,6 +1,6 @@ Name: dpdk Version: 21.11 -Release: 41 +Release: 42 Packager: packaging@6wind.com URL: http://dpdk.org %global source_version 21.11 @@ -295,6 +295,14 @@ Patch9273: 0273-cryptodev-fix-telemetry-data-truncation.patch Patch9274: 0274-mem-fix-telemetry-data-truncation.patch Patch9275: 0275-telemetry-support-adding-integer-as-hexadecimal.patch Patch9276: 0276-ethdev-get-capabilities-from-telemetry-in-hexadecima.patch +Patch9277: 0277-mem-fix-hugepage-info-mapping.patch +Patch9278: 0278-raw-ifpga-base-fix-init-with-multi-process.patch +Patch9279: 0279-compressdev-fix-empty-devargs-parsing.patch +Patch9280: 0280-cryptodev-fix-empty-devargs-parsing.patch +Patch9281: 0281-net-hns3-fix-empty-devargs-parsing.patch +Patch9282: 0282-net-virtio-fix-empty-devargs-parsing.patch +Patch9283: 0283-dma-skeleton-fix-empty-devargs-parsing.patch +Patch9284: 0284-raw-skeleton-fix-empty-devargs-parsing.patch Summary: Data Plane Development Kit core Group: System Environment/Libraries @@ -442,6 +450,18 @@ strip -g $RPM_BUILD_ROOT/lib/modules/%{kern_devel_ver}/extra/dpdk/igb_uio.ko /usr/sbin/depmod %changelog +* Thu Apr 27 2023 chenjiji - 21.11-42 +- fix empty devargs parsing + Sync some patchs from upstreaming and modifies are as + follow: + 1. The rte_kvargs_process() was used to parse KV pairs, it + also supports to parse 'only keys' 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'. + 2. The MAP_FAILED should be used to determine whether the + mapping is successful but not NULL. This patch fix it. + * Fri Apr 21 2023 chenjiji - 21.11-41 - Telemetry: support display as hexadecimal Sync some patchs from upstreaming for telemetry and modifies -- Gitee