mbox series

[v2,00/44] fix segment fault when parse args

Message ID 20230320092110.37295-1-fengchengwen@huawei.com (mailing list archive)
Headers
Series fix segment fault when parse args |

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'.

It may leads to segment fault when parse args with 'only key', this
patchset fixes rest of them.

Chengwen Feng (44):
  app/pdump: fix segment fault when parse args
  ethdev: fix segment fault when parse args
  net/memif: fix segment fault when parse devargs
  net/pcap: fix segment fault when parse devargs
  net/ring: fix segment fault when parse devargs
  net/sfc: fix segment fault when parse devargs
  net/af_xdp: fix segment fault when parse devargs
  net/ark: fix segment fault when parse devargs
  net/cnxk: fix segment fault when parse devargs
  net/cxgbe: fix segment fault when parse devargs
  net/dpaa2: fix segment fault when parse devargs
  net/ena: fix segment fault when parse devargs
  net/enic: fix segment fault when parse devargs
  net/fm10k: fix segment fault when parse devargs
  net/i40e: fix segment fault when parse devargs
  net/iavf: fix segment fault when parse devargs
  net/ice: fix segment fault when parse devargs
  net/idpf: fix segment fault when parse devargs
  net/ionic: fix segment fault when parse devargs
  net/mana: fix segment fault when parse devargs
  net/mlx4: fix segment fault when parse devargs
  net/mvneta: fix segment fault when parse devargs
  net/mvpp2: fix segment fault when parse devargs
  net/netvsc: fix segment fault when parse devargs
  net/octeontx: fix segment fault when parse devargs
  net/pfe: fix segment fault when parse devargs
  net/qede: fix segment fault when parse devargs
  baseband/la12xx: fix segment fault when parse devargs
  bus/pci: fix segment fault when parse args
  common/mlx5: fix segment fault when parse devargs
  crypto/cnxk: fix segment fault when parse devargs
  crypto/dpaa_sec: fix segment fault when parse devargs
  crypto/dpaa2_sec: fix segment fault when parse devargs
  crypto/mvsam: fix segment fault when parse devargs
  crypto/scheduler: fix segment fault when parse devargs
  dma/dpaa2: fix segment fault when parse devargs
  event/cnxk: fix segment fault when parse devargs
  event/dlb2: fix segment fault when parse devargs
  event/dpaa: fix segment fault when parse devargs
  event/octeontx: fix segment fault when parse devargs
  event/opdl: fix segment fault when parse devargs
  event/sw: fix segment fault when parse devargs
  mempool/cnxk: fix segment fault when parse devargs
  raw/cnxk_gpio: fix segment fault when parse devargs

---
v2: according Ferruh's comments:
    fix all 'rte_kvargs_process()' bug instances.
    only judge value validation.

 app/pdump/main.c                             | 12 ++++++
 drivers/baseband/la12xx/bbdev_la12xx.c       |  3 ++
 drivers/bus/pci/pci_params.c                 |  2 +
 drivers/common/mlx5/mlx5_common.c            |  5 +++
 drivers/crypto/cnxk/cnxk_cryptodev_devargs.c |  3 ++
 drivers/crypto/dpaa2_sec/dpaa2_sec_dpseci.c  |  2 +
 drivers/crypto/dpaa_sec/dpaa_sec.c           |  3 ++
 drivers/crypto/mvsam/rte_mrvl_pmd.c          |  6 +++
 drivers/crypto/scheduler/scheduler_pmd.c     | 21 +++++++++++
 drivers/dma/dpaa2/dpaa2_qdma.c               |  3 ++
 drivers/event/cnxk/cnxk_eventdev.c           |  6 +++
 drivers/event/cnxk/cnxk_eventdev.h           |  6 +++
 drivers/event/cnxk/cnxk_tim_evdev.c          |  6 +++
 drivers/event/dlb2/dlb2.c                    |  5 ++-
 drivers/event/dpaa/dpaa_eventdev.c           |  3 ++
 drivers/event/octeontx/ssovf_evdev.c         |  2 +
 drivers/event/opdl/opdl_evdev.c              |  9 +++++
 drivers/event/sw/sw_evdev.c                  | 12 ++++++
 drivers/mempool/cnxk/cnxk_mempool.c          |  3 ++
 drivers/net/af_xdp/rte_eth_af_xdp.c          | 12 ++++++
 drivers/net/ark/ark_ethdev.c                 |  3 ++
 drivers/net/cnxk/cnxk_ethdev_devargs.c       | 39 ++++++++++++++++++++
 drivers/net/cnxk/cnxk_ethdev_sec.c           | 12 ++++++
 drivers/net/cxgbe/cxgbe_main.c               |  3 ++
 drivers/net/dpaa2/dpaa2_ethdev.c             |  3 ++
 drivers/net/ena/ena_ethdev.c                 |  6 +++
 drivers/net/enic/enic_ethdev.c               |  6 +++
 drivers/net/fm10k/fm10k_ethdev.c             |  3 ++
 drivers/net/i40e/i40e_ethdev.c               | 15 ++++++++
 drivers/net/iavf/iavf_ethdev.c               |  6 +++
 drivers/net/ice/ice_dcf_ethdev.c             |  6 +++
 drivers/net/ice/ice_ethdev.c                 |  6 +++
 drivers/net/idpf/idpf_ethdev.c               |  6 +++
 drivers/net/ionic/ionic_dev_pci.c            |  3 ++
 drivers/net/mana/mana.c                      |  3 ++
 drivers/net/memif/rte_eth_memif.c            | 30 +++++++++++++++
 drivers/net/mlx4/mlx4.c                      |  3 ++
 drivers/net/mvneta/mvneta_ethdev.c           |  3 ++
 drivers/net/mvpp2/mrvl_ethdev.c              |  3 ++
 drivers/net/mvpp2/mrvl_qos.c                 |  6 ++-
 drivers/net/netvsc/hn_ethdev.c               |  3 ++
 drivers/net/octeontx/octeontx_ethdev.c       |  3 ++
 drivers/net/pcap/pcap_ethdev.c               | 18 ++++++++-
 drivers/net/pfe/pfe_ethdev.c                 |  3 ++
 drivers/net/qede/qede_ethdev.c               |  3 ++
 drivers/net/ring/rte_eth_ring.c              |  6 +++
 drivers/net/sfc/sfc.c                        |  3 ++
 drivers/net/sfc/sfc_ev.c                     |  3 ++
 drivers/net/sfc/sfc_kvargs.c                 |  6 +++
 drivers/raw/cnxk_gpio/cnxk_gpio.c            |  6 +++
 lib/ethdev/rte_class_eth.c                   |  6 +++
 51 files changed, 345 insertions(+), 4 deletions(-)
  

Comments

fengchengwen April 15, 2023, 1:38 a.m. UTC | #1
Hi Thomas, Ferruh,

  This patch-set get almost 30% ack by PMD's maintainer.
  Could it be applied? and squeeze the patch-set is okay.

  Another thread talk about a change in kvargs API, we could discuss here.
  My opinion:
    1) the below PMD has the bug, but there are also many PMD take care of only key situation.
       I think it mainly because the API definition is not detailed, but this hole was already
       fill by commit: 52ab17efdec.
    2) the rte_kvargs_get API, I think we could refine it definition, because it can't identify
       invalid keys and only-keys (both of them return NULL), and I suggest add one extra parameter:
       const char *rte_kvargs_get(const struct rte_kvargs *kvlist, const char *key, bool *key_exist);

Thanks.

On 2023/3/20 17:20, Chengwen Feng 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'.
> 
> It may leads to segment fault when parse args with 'only key', this
> patchset fixes rest of them.
> 
> Chengwen Feng (44):
>   app/pdump: fix segment fault when parse args
>   ethdev: fix segment fault when parse args
>   net/memif: fix segment fault when parse devargs
>   net/pcap: fix segment fault when parse devargs
>   net/ring: fix segment fault when parse devargs
>   net/sfc: fix segment fault when parse devargs
>   net/af_xdp: fix segment fault when parse devargs
>   net/ark: fix segment fault when parse devargs
>   net/cnxk: fix segment fault when parse devargs
>   net/cxgbe: fix segment fault when parse devargs
>   net/dpaa2: fix segment fault when parse devargs
>   net/ena: fix segment fault when parse devargs
>   net/enic: fix segment fault when parse devargs
>   net/fm10k: fix segment fault when parse devargs
>   net/i40e: fix segment fault when parse devargs
>   net/iavf: fix segment fault when parse devargs
>   net/ice: fix segment fault when parse devargs
>   net/idpf: fix segment fault when parse devargs
>   net/ionic: fix segment fault when parse devargs
>   net/mana: fix segment fault when parse devargs
>   net/mlx4: fix segment fault when parse devargs
>   net/mvneta: fix segment fault when parse devargs
>   net/mvpp2: fix segment fault when parse devargs
>   net/netvsc: fix segment fault when parse devargs
>   net/octeontx: fix segment fault when parse devargs
>   net/pfe: fix segment fault when parse devargs
>   net/qede: fix segment fault when parse devargs
>   baseband/la12xx: fix segment fault when parse devargs
>   bus/pci: fix segment fault when parse args
>   common/mlx5: fix segment fault when parse devargs
>   crypto/cnxk: fix segment fault when parse devargs
>   crypto/dpaa_sec: fix segment fault when parse devargs
>   crypto/dpaa2_sec: fix segment fault when parse devargs
>   crypto/mvsam: fix segment fault when parse devargs
>   crypto/scheduler: fix segment fault when parse devargs
>   dma/dpaa2: fix segment fault when parse devargs
>   event/cnxk: fix segment fault when parse devargs
>   event/dlb2: fix segment fault when parse devargs
>   event/dpaa: fix segment fault when parse devargs
>   event/octeontx: fix segment fault when parse devargs
>   event/opdl: fix segment fault when parse devargs
>   event/sw: fix segment fault when parse devargs
>   mempool/cnxk: fix segment fault when parse devargs
>   raw/cnxk_gpio: fix segment fault when parse devargs
> 
> ---
> v2: according Ferruh's comments:
>     fix all 'rte_kvargs_process()' bug instances.
>     only judge value validation.
> 
>  app/pdump/main.c                             | 12 ++++++
>  drivers/baseband/la12xx/bbdev_la12xx.c       |  3 ++
>  drivers/bus/pci/pci_params.c                 |  2 +
>  drivers/common/mlx5/mlx5_common.c            |  5 +++
>  drivers/crypto/cnxk/cnxk_cryptodev_devargs.c |  3 ++
>  drivers/crypto/dpaa2_sec/dpaa2_sec_dpseci.c  |  2 +
>  drivers/crypto/dpaa_sec/dpaa_sec.c           |  3 ++
>  drivers/crypto/mvsam/rte_mrvl_pmd.c          |  6 +++
>  drivers/crypto/scheduler/scheduler_pmd.c     | 21 +++++++++++
>  drivers/dma/dpaa2/dpaa2_qdma.c               |  3 ++
>  drivers/event/cnxk/cnxk_eventdev.c           |  6 +++
>  drivers/event/cnxk/cnxk_eventdev.h           |  6 +++
>  drivers/event/cnxk/cnxk_tim_evdev.c          |  6 +++
>  drivers/event/dlb2/dlb2.c                    |  5 ++-
>  drivers/event/dpaa/dpaa_eventdev.c           |  3 ++
>  drivers/event/octeontx/ssovf_evdev.c         |  2 +
>  drivers/event/opdl/opdl_evdev.c              |  9 +++++
>  drivers/event/sw/sw_evdev.c                  | 12 ++++++
>  drivers/mempool/cnxk/cnxk_mempool.c          |  3 ++
>  drivers/net/af_xdp/rte_eth_af_xdp.c          | 12 ++++++
>  drivers/net/ark/ark_ethdev.c                 |  3 ++
>  drivers/net/cnxk/cnxk_ethdev_devargs.c       | 39 ++++++++++++++++++++
>  drivers/net/cnxk/cnxk_ethdev_sec.c           | 12 ++++++
>  drivers/net/cxgbe/cxgbe_main.c               |  3 ++
>  drivers/net/dpaa2/dpaa2_ethdev.c             |  3 ++
>  drivers/net/ena/ena_ethdev.c                 |  6 +++
>  drivers/net/enic/enic_ethdev.c               |  6 +++
>  drivers/net/fm10k/fm10k_ethdev.c             |  3 ++
>  drivers/net/i40e/i40e_ethdev.c               | 15 ++++++++
>  drivers/net/iavf/iavf_ethdev.c               |  6 +++
>  drivers/net/ice/ice_dcf_ethdev.c             |  6 +++
>  drivers/net/ice/ice_ethdev.c                 |  6 +++
>  drivers/net/idpf/idpf_ethdev.c               |  6 +++
>  drivers/net/ionic/ionic_dev_pci.c            |  3 ++
>  drivers/net/mana/mana.c                      |  3 ++
>  drivers/net/memif/rte_eth_memif.c            | 30 +++++++++++++++
>  drivers/net/mlx4/mlx4.c                      |  3 ++
>  drivers/net/mvneta/mvneta_ethdev.c           |  3 ++
>  drivers/net/mvpp2/mrvl_ethdev.c              |  3 ++
>  drivers/net/mvpp2/mrvl_qos.c                 |  6 ++-
>  drivers/net/netvsc/hn_ethdev.c               |  3 ++
>  drivers/net/octeontx/octeontx_ethdev.c       |  3 ++
>  drivers/net/pcap/pcap_ethdev.c               | 18 ++++++++-
>  drivers/net/pfe/pfe_ethdev.c                 |  3 ++
>  drivers/net/qede/qede_ethdev.c               |  3 ++
>  drivers/net/ring/rte_eth_ring.c              |  6 +++
>  drivers/net/sfc/sfc.c                        |  3 ++
>  drivers/net/sfc/sfc_ev.c                     |  3 ++
>  drivers/net/sfc/sfc_kvargs.c                 |  6 +++
>  drivers/raw/cnxk_gpio/cnxk_gpio.c            |  6 +++
>  lib/ethdev/rte_class_eth.c                   |  6 +++
>  51 files changed, 345 insertions(+), 4 deletions(-)
>
  
Ferruh Yigit April 17, 2023, 4:37 p.m. UTC | #2
On 4/15/2023 2:38 AM, fengchengwen wrote:
> Hi Thomas, Ferruh,
> 
>   This patch-set get almost 30% ack by PMD's maintainer.
>   Could it be applied? and squeeze the patch-set is okay.
> 

Hi Chengwen,

The patch is trivial and safe on its own, so for me having enough ack or
not is not what blocks the set.

As we discussed before, instead of adding NULL checks to the callbacks,
it is better to handle this in the kvargs API level, that discussion is
holding this patchset back.

According result of discussion we may prefer to not merge this patch at all.


>   Another thread talk about a change in kvargs API, we could discuss here.
>   My opinion:
>     1) the below PMD has the bug, but there are also many PMD take care of only key situation.
>        I think it mainly because the API definition is not detailed, but this hole was already
>        fill by commit: 52ab17efdec.

Ack

>     2) the rte_kvargs_get API, I think we could refine it definition, because it can't identify
>        invalid keys and only-keys (both of them return NULL), and I suggest add one extra parameter:
>        const char *rte_kvargs_get(const struct rte_kvargs *kvlist, const char *key, bool *key_exist);
> 

I am not clear why to update `rte_kvargs_get()`, and how to benefit from
this update.

My suggestion was to update kvargs API to let user of API define if
'key' should have a 'value' or not, similar to done in `getopt()` API.


One option can be to update `rte_kvargs_parse()` API to recognize a
special char in "const char *const valid_keys[]" to know if value
expected or not, and API can do internal checks based on this information.

To reduce the impact of change, no special char in the valid_keys string
may mean key expects a value (I think this is the most common case), and
in this case if "value == NULL" API can return an error.
But if there is a special char at the end, lets say '-', key doesn't
need a value and having "value == NULL" is accepted.
Again this is similar to ':' char in the `getopt()` API, but meaning is
reverse.


Above is just an option, there can be another solution by to updating
`rte_kvargs_process()` API, only this may be more disruptive.

Any other solution is welcomed.

> Thanks.
> 
> On 2023/3/20 17:20, Chengwen Feng 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'.
>>
>> It may leads to segment fault when parse args with 'only key', this
>> patchset fixes rest of them.
>>
>> Chengwen Feng (44):
>>   app/pdump: fix segment fault when parse args
>>   ethdev: fix segment fault when parse args
>>   net/memif: fix segment fault when parse devargs
>>   net/pcap: fix segment fault when parse devargs
>>   net/ring: fix segment fault when parse devargs
>>   net/sfc: fix segment fault when parse devargs
>>   net/af_xdp: fix segment fault when parse devargs
>>   net/ark: fix segment fault when parse devargs
>>   net/cnxk: fix segment fault when parse devargs
>>   net/cxgbe: fix segment fault when parse devargs
>>   net/dpaa2: fix segment fault when parse devargs
>>   net/ena: fix segment fault when parse devargs
>>   net/enic: fix segment fault when parse devargs
>>   net/fm10k: fix segment fault when parse devargs
>>   net/i40e: fix segment fault when parse devargs
>>   net/iavf: fix segment fault when parse devargs
>>   net/ice: fix segment fault when parse devargs
>>   net/idpf: fix segment fault when parse devargs
>>   net/ionic: fix segment fault when parse devargs
>>   net/mana: fix segment fault when parse devargs
>>   net/mlx4: fix segment fault when parse devargs
>>   net/mvneta: fix segment fault when parse devargs
>>   net/mvpp2: fix segment fault when parse devargs
>>   net/netvsc: fix segment fault when parse devargs
>>   net/octeontx: fix segment fault when parse devargs
>>   net/pfe: fix segment fault when parse devargs
>>   net/qede: fix segment fault when parse devargs
>>   baseband/la12xx: fix segment fault when parse devargs
>>   bus/pci: fix segment fault when parse args
>>   common/mlx5: fix segment fault when parse devargs
>>   crypto/cnxk: fix segment fault when parse devargs
>>   crypto/dpaa_sec: fix segment fault when parse devargs
>>   crypto/dpaa2_sec: fix segment fault when parse devargs
>>   crypto/mvsam: fix segment fault when parse devargs
>>   crypto/scheduler: fix segment fault when parse devargs
>>   dma/dpaa2: fix segment fault when parse devargs
>>   event/cnxk: fix segment fault when parse devargs
>>   event/dlb2: fix segment fault when parse devargs
>>   event/dpaa: fix segment fault when parse devargs
>>   event/octeontx: fix segment fault when parse devargs
>>   event/opdl: fix segment fault when parse devargs
>>   event/sw: fix segment fault when parse devargs
>>   mempool/cnxk: fix segment fault when parse devargs
>>   raw/cnxk_gpio: fix segment fault when parse devargs
>>
>> ---
>> v2: according Ferruh's comments:
>>     fix all 'rte_kvargs_process()' bug instances.
>>     only judge value validation.
>>
>>  app/pdump/main.c                             | 12 ++++++
>>  drivers/baseband/la12xx/bbdev_la12xx.c       |  3 ++
>>  drivers/bus/pci/pci_params.c                 |  2 +
>>  drivers/common/mlx5/mlx5_common.c            |  5 +++
>>  drivers/crypto/cnxk/cnxk_cryptodev_devargs.c |  3 ++
>>  drivers/crypto/dpaa2_sec/dpaa2_sec_dpseci.c  |  2 +
>>  drivers/crypto/dpaa_sec/dpaa_sec.c           |  3 ++
>>  drivers/crypto/mvsam/rte_mrvl_pmd.c          |  6 +++
>>  drivers/crypto/scheduler/scheduler_pmd.c     | 21 +++++++++++
>>  drivers/dma/dpaa2/dpaa2_qdma.c               |  3 ++
>>  drivers/event/cnxk/cnxk_eventdev.c           |  6 +++
>>  drivers/event/cnxk/cnxk_eventdev.h           |  6 +++
>>  drivers/event/cnxk/cnxk_tim_evdev.c          |  6 +++
>>  drivers/event/dlb2/dlb2.c                    |  5 ++-
>>  drivers/event/dpaa/dpaa_eventdev.c           |  3 ++
>>  drivers/event/octeontx/ssovf_evdev.c         |  2 +
>>  drivers/event/opdl/opdl_evdev.c              |  9 +++++
>>  drivers/event/sw/sw_evdev.c                  | 12 ++++++
>>  drivers/mempool/cnxk/cnxk_mempool.c          |  3 ++
>>  drivers/net/af_xdp/rte_eth_af_xdp.c          | 12 ++++++
>>  drivers/net/ark/ark_ethdev.c                 |  3 ++
>>  drivers/net/cnxk/cnxk_ethdev_devargs.c       | 39 ++++++++++++++++++++
>>  drivers/net/cnxk/cnxk_ethdev_sec.c           | 12 ++++++
>>  drivers/net/cxgbe/cxgbe_main.c               |  3 ++
>>  drivers/net/dpaa2/dpaa2_ethdev.c             |  3 ++
>>  drivers/net/ena/ena_ethdev.c                 |  6 +++
>>  drivers/net/enic/enic_ethdev.c               |  6 +++
>>  drivers/net/fm10k/fm10k_ethdev.c             |  3 ++
>>  drivers/net/i40e/i40e_ethdev.c               | 15 ++++++++
>>  drivers/net/iavf/iavf_ethdev.c               |  6 +++
>>  drivers/net/ice/ice_dcf_ethdev.c             |  6 +++
>>  drivers/net/ice/ice_ethdev.c                 |  6 +++
>>  drivers/net/idpf/idpf_ethdev.c               |  6 +++
>>  drivers/net/ionic/ionic_dev_pci.c            |  3 ++
>>  drivers/net/mana/mana.c                      |  3 ++
>>  drivers/net/memif/rte_eth_memif.c            | 30 +++++++++++++++
>>  drivers/net/mlx4/mlx4.c                      |  3 ++
>>  drivers/net/mvneta/mvneta_ethdev.c           |  3 ++
>>  drivers/net/mvpp2/mrvl_ethdev.c              |  3 ++
>>  drivers/net/mvpp2/mrvl_qos.c                 |  6 ++-
>>  drivers/net/netvsc/hn_ethdev.c               |  3 ++
>>  drivers/net/octeontx/octeontx_ethdev.c       |  3 ++
>>  drivers/net/pcap/pcap_ethdev.c               | 18 ++++++++-
>>  drivers/net/pfe/pfe_ethdev.c                 |  3 ++
>>  drivers/net/qede/qede_ethdev.c               |  3 ++
>>  drivers/net/ring/rte_eth_ring.c              |  6 +++
>>  drivers/net/sfc/sfc.c                        |  3 ++
>>  drivers/net/sfc/sfc_ev.c                     |  3 ++
>>  drivers/net/sfc/sfc_kvargs.c                 |  6 +++
>>  drivers/raw/cnxk_gpio/cnxk_gpio.c            |  6 +++
>>  lib/ethdev/rte_class_eth.c                   |  6 +++
>>  51 files changed, 345 insertions(+), 4 deletions(-)
>>