Re: [PATCH] Fix NULL difference in super_by_fd

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 12/12/22 04:23, lixiaokeng wrote:
> When we create 100 partitions(major is 259 not 254) in a raid device,
> mdadm may coredump:
> 
> Core was generated by `/usr/sbin/mdadm --detail --export /dev/md1p3'.
> Program terminated with signal SIGSEGV, Segmentation fault.
> #0  __strlen_sse2 ()
>     at ../sysdeps/x86_64/multiarch/strlen-vec.S:126
> 126		movdqu	(%rax), %xmm4
> (gdb) bt
> #0  __strlen_sse2 ()
>     at ../sysdeps/x86_64/multiarch/strlen-vec.S:126
> #1  0x00007f1944659139 in __strcpy_chk (
>     dest=dest@entry=0x55ea8d7c23ac "", src=0x0,
>     destlen=destlen@entry=32) at strcpy_chk.c:28
> #2  0x000055ea8d10b66d in strcpy (__src=<optimized out>,
>     __dest=0x55ea8d7c23ac "")
>     at /usr/include/bits/string_fortified.h:79
> #3  super_by_fd (fd=fd@entry=3,
>     subarrayp=subarrayp@entry=0x7ffe6a1dff08) at util.c:1289
> #4  0x000055ea8d11b3a6 in Detail (
>     dev=0x7ffe6a1e2f22 "/dev/md1p3", c=0x7ffe6a1e1700)
>     at Detail.c:101
> #5  0x000055ea8d101e61 in misc_list (c=<optimized out>,
>     ss=<optimized out>, dump_directory=<optimized out>,
>     ident=<optimized out>, devlist=<optimized out>)
>     at mdadm.c:1959
> #6  main (argc=<optimized out>, argv=<optimized out>)
>     at mdadm.c:1629
> 
> The direct cause is fd2devnm return NULL. Here add a check.
> 
> Signed-off-by:Lixiaokeng<lixiaokeng@xxxxxxxxxx>
> Signed-off-by:Wuguanghao<wuguanghao3@xxxxxxxxxx>
> ---
>  util.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/util.c b/util.c
> index 26ffdcea..843bfc6d 100644
> --- a/util.c
> +++ b/util.c
> @@ -1177,6 +1177,7 @@ struct supertype *super_by_fd(int fd, char **subarrayp)
>  	int i;
>  	char *subarray = NULL;
>  	char container[32] = "";
> +	char *devnm = NULL;
> 
>  	sra = sysfs_read(fd, NULL, GET_VERSION);
> 
> @@ -1222,7 +1223,10 @@ struct supertype *super_by_fd(int fd, char **subarrayp)
>  		if (subarrayp)
>  			*subarrayp = subarray;
>  		strcpy(st->container_devnm, container);
> -		strcpy(st->devnm, fd2devnm(fd));
> +		if (devnm = fd2devnm(fd))
> +			strcpy(st->devnm, devnm);
> +		else
> +			st->devnm[0] = '\0';

I don't think this is the correct fix. You end up returning an
incomplete 'st' entry, which could cause unexpected behavior. I think
the right way to handle this is to fail properly and return NULL from
super_by_fd(), after cleaning up properly.

Cheers,
Jes





[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux