[dm-devel] [PATCH]dm_get_map: fix segfault when can't found target

Benjamin Marzinski bmarzins at redhat.com
Fri May 27 19:35:44 UTC 2022


On Fri, May 27, 2022 at 10:27:37AM +0800, Wu Guanghao wrote:
> We got a segfault when we test multipath + iscsi.
> 
> (gdb) bt
> #0  __strlen_avx2 () at ../sysdeps/x86_64/multiarch/strlen-avx2.S:74
> #1  0x00007f694306cd23 in __GI___strdup (s=0x0) at strdup.c:41
> #2  0x00007f69433a147c in dm_get_map (name=0x55d4bc090320 "3600140537cde137ea8c43d8a971462c7",
>     size=size at entry=0x55d4bc0270d8, outparams=outparams at entry=0x7f6941add640) at devmapper.c:688
> #3  0x00007f69433cbbdf in update_multipath_table (mpp=mpp at entry=0x55d4bc026f30,
>     pathvec=pathvec at entry=0x55d4bc063990, flags=flags at entry=0) at structs_vec.c:426
> #4  0x00007f69433cbfe5 in update_multipath_strings (mpp=0x55d4bc026f30, pathvec=0x55d4bc063990)
>     at structs_vec.c:526
> #5  0x000055d4bb52e03e in check_path (vecs=0x55d4bbfad760, pp=0x7f692402d270, ticks=<optimized out>)
>     at main.c:2280
> #6  0x000055d4bb52f3e2 in checkerloop (ap=0x55d4bbfad760) at main.c:2542
> #7  0x00007f694305b3ba in start_thread (arg=<optimized out>) at pthread_create.c:443
> #8  0x00007f69430ddb40 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81
> (gdb) f 2
> #2  0x00007f69433a147c in dm_get_map (name=0x55d4bc090320 "3600140537cde137ea8c43d8a971462c7",
>     size=size at entry=0x55d4bc0270d8, outparams=outparams at entry=0x7f6941add640) at devmapper.c:688
> 688			*outparams = strdup(params);
> (gdb) l
> 683			*size = length;
> 684	
> 685		if (!outparams)
> 686			r = DMP_OK;
> 687		else {
> 688			*outparams = strdup(params);
> 689			r = *outparams ? DMP_OK : DMP_ERR;
> 690		}
> 691	
> 692	out:
> (gdb) p params
> $1 = 0x0
> 
> If can't found target, we should goto out
> 
> Signed-off-by: Wu Guanghao <wuguanghao3 at huawei.com>

Reviewed-by: Benjamin Marzinski <bmarzins at redhat.com>

> ---
>  libmultipath/devmapper.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/libmultipath/devmapper.c b/libmultipath/devmapper.c
> index 2507f77f..450b17ef 100644
> --- a/libmultipath/devmapper.c
> +++ b/libmultipath/devmapper.c
> @@ -682,8 +682,8 @@ int dm_get_map(const char *name, unsigned long long *size, char **outparams)
>         r = DMP_NOT_FOUND;
>         /* Fetch 1st target */
>         if (dm_get_next_target(dmt, NULL, &start, &length,
> -                              &target_type, &params) != NULL)
> -               /* more than one target */
> +                              &target_type, &params) != NULL || !params)
> +               /* more than one target or not found target */
>                 goto out;
> 
>         if (size)
> --
> 2.27.0


More information about the dm-devel mailing list