[PATCH v3] ifconfig: fix double free fatal error in INET_sprint

walter harms wharms at bfs.de
Tue Feb 3 10:03:47 UTC 2015


Hello Zheng Junling,

we have now 3 patch with obvious differences. Could you please explain
what are the changes ?

re,
 wh


Am 03.02.2015 10:12, schrieb Zheng Junling:
> While INET_sprint or INET6_sprint is called circularly by keeping
> ifconfiging, sap->sa_family would be cleaned by other parallel processes
> such as dhclient sometimes, and then there would be a double free error
> like the following:
> 
>   *** glibc detected *** ifconfig: double free or corruption (fasttop): 0x000a6008 ***
>   ======= Backtrace: =========
>   /lib/libc.so.6(+0x6bc84)[0x40133c84]
>   /lib/libc.so.6(cfree+0x94)[0x40138684]
>   ifconfig[0x1c460]
>   ifconfig[0x1c6a0]
>   ifconfig[0x1ccf4]
>   ifconfig[0x187c8]
>   ifconfig[0xd544]
>   ifconfig[0xd5dc]
>   ifconfig[0xdca8]
>   /lib/libc.so.6(__libc_start_main+0x110)[0x400df258]
>   ======= Memory map: ========
>   00008000-0009c000 r-xp 00000000 1f:05 444328     /bin/busybox
>   000a3000-000a4000 rw-p 00093000 1f:05 444328     /bin/busybox
> 
> We set the buff pointer to be NULL to avoid double freeing. However, it
> is still incomprehensible.
> 
> TODO: INET_sprint and INET6_sprint are only used in networking/interface.c.
> Shall we refactor these two funcs by passing a pointer to them, and then
> returning it?
> 
> Signed-off-by: Zheng Junling <zhengjunling at huawei.com>
> Signed-off-by: Chen Gang <cg.chen at huawei.com>
> Reported-by: Chen Gang <cg.chen at huawei.com>
> ---
>  networking/interface.c |    2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/networking/interface.c b/networking/interface.c
> index bf7d2b1..65f2392 100644
> --- a/networking/interface.c
> +++ b/networking/interface.c
> @@ -92,6 +92,7 @@ static const char* FAST_FUNC INET_sprint(struct sockaddr *sap, int numeric)
>  	static char *buff; /* defaults to NULL */
>  
>  	free(buff);
> +	buff = NULL;
>  	if (sap->sa_family == 0xFFFF || sap->sa_family == 0)
>  		return "[NONE SET]";
>  	buff = INET_rresolve((struct sockaddr_in *) sap, numeric, 0xffffff00);
> @@ -174,6 +175,7 @@ static const char* FAST_FUNC INET6_sprint(struct sockaddr *sap, int numeric)
>  	static char *buff;
>  
>  	free(buff);
> +	buff = NULL;
>  	if (sap->sa_family == 0xFFFF || sap->sa_family == 0)
>  		return "[NONE SET]";
>  	buff = INET6_rresolve((struct sockaddr_in6 *) sap, numeric);


More information about the busybox mailing list