There are a few only-key situation which use rte_kvargs_process to process, If 
we make
this change, the above case will fail.

Actually I locally make similar change plus a new API (rte_kvargs_process_opt), 
this
new API will cover key/value and only-key match, while rte_kvargs_process make 
restrict
only work for key/value match.

I didn't send the patches because it too late for adding this new API due to 
already RC1.

/**
 * Call a handler function for each key/value or only-key matching the key
 *
 * For each key/value or only-key association that matches the given key, calls
 * the handler function with the for a given arg_name passing the value on the
 * dictionary for that key and a given extra argument.
 *
 * @param kvlist
 *   The rte_kvargs structure. No error if NULL.
 * @param key_match
 *   The key on which the handler should be called, or NULL to process handler
 *   on all associations
 * @param handler
 *   The function to call for each matching key
 * @param opaque_arg
 *   A pointer passed unchanged to the handler
 *
 * @return
 *   - 0 on success
 *   - Negative on error
 */
int rte_kvargs_process_opt(const struct rte_kvargs *kvlist,
        const char *key_match, arg_handler_t handler, void *opaque_arg);


On 2023/11/1 4:58, Stephen Hemminger wrote:
> There is class of problems in current DPDK where rte_kvargs
> is used a key/value pair is passed without an associated value.
> Currently, this can cause a NULL dereference in the rte_kvargs_process
> handler.
> 
> Reported-by: Chengwen Feng <fengcheng...@huawei.com>
> Signed-off-by: Stephen Hemminger <step...@networkplumber.org>
> ---
>  lib/kvargs/rte_kvargs.c | 3 +++
>  lib/kvargs/rte_kvargs.h | 3 +++
>  2 files changed, 6 insertions(+)
> 
> diff --git a/lib/kvargs/rte_kvargs.c b/lib/kvargs/rte_kvargs.c
> index c77bb82feb..5481f58584 100644
> --- a/lib/kvargs/rte_kvargs.c
> +++ b/lib/kvargs/rte_kvargs.c
> @@ -185,6 +185,9 @@ rte_kvargs_process(const struct rte_kvargs *kvlist,
>       for (i = 0; i < kvlist->count; i++) {
>               pair = &kvlist->pairs[i];
>               if (key_match == NULL || strcmp(pair->key, key_match) == 0) {
> +                     if (pair->value == NULL)
> +                             return -1;
> +
>                       if ((*handler)(pair->key, pair->value, opaque_arg) < 0)
>                               return -1;
>               }
> diff --git a/lib/kvargs/rte_kvargs.h b/lib/kvargs/rte_kvargs.h
> index 4900b750bc..fd9a3238f0 100644
> --- a/lib/kvargs/rte_kvargs.h
> +++ b/lib/kvargs/rte_kvargs.h
> @@ -178,6 +178,9 @@ const char *rte_kvargs_get_with_value(const struct 
> rte_kvargs *kvlist,
>   * handler function with the for a given arg_name passing the value on the
>   * dictionary for that key and a given extra argument.
>   *
> + * If no value was specified with the given key, then this
> + * function will return -1 and the handlere will not be called.
> + *
>   * @param kvlist
>   *   The rte_kvargs structure. No error if NULL.
>   * @param key_match
> 

Reply via email to