Bug#509167: mdadm: check asprintf() return codes

Neil Brown neilb at suse.de
Wed Jan 7 22:33:32 UTC 2009


On Monday January 5, kirkland at canonical.com wrote:
> On Fri, 2008-12-19 at 16:02 +1100, Neil Brown wrote:
> > I'm not really keen on taking this sort of patch.
> > It isn't clear that an abort (caused by the assert) is really much
> > better than just segfaulting normally ... though you do get a message
> > I guess.
> > But it makes the code rather ugly.
> > 
> > Maybe if you defined a asprintf_nofail (possibly an inline in mdadm.h)
> > and called that it would be acceptable.
> 
> Hi Neil, et al-
> 
> I have an updated patch attached.
> 
> I actually called the function xasprintf(), as that seems to be used
> elsewhere.
> 
> I have verified that this code builds, but I have not functionally
> tested it.
> 
> Perhaps you're more willing to accept something like this?

Yes, that looks much better, thanks.

I have committed it to my git tree.

Thanks,
NeilBrown

> 
> -- 
> :-Dustin
> 
> Dustin Kirkland
> Ubuntu Server Developer
> Canonical, LTD
> kirkland at canonical.com
> GPG: 1024D/83A61194
> diff -uprN mdadm-2.6.7.1.orig/Assemble.c mdadm-2.6.7.1/Assemble.c
> --- mdadm-2.6.7.1.orig/Assemble.c	2008-10-15 00:29:37.000000000 -0500
> +++ mdadm-2.6.7.1/Assemble.c	2009-01-05 18:35:02.021045097 -0600
> @@ -386,9 +386,9 @@ int Assemble(struct supertype *st, char 
>  		if (c) c++; else c= info.name;
>  		if (isdigit(*c) && ((ident->autof & 7)==4 || (ident->autof&7)==6))
>  			/* /dev/md/d0 style for partitionable */
> -			asprintf(&mddev, "/dev/md/d%s", c);
> +			xasprintf(&mddev, "/dev/md/d%s", c);
>  		else
> -			asprintf(&mddev, "/dev/md/%s", c);
> +			xasprintf(&mddev, "/dev/md/%s", c);
>  		mdfd = open_mddev(mddev, ident->autof);
>  		if (mdfd < 0) {
>  			st->ss->free_super(st);
> diff -uprN mdadm-2.6.7.1.orig/config.c mdadm-2.6.7.1/config.c
> --- mdadm-2.6.7.1.orig/config.c	2008-10-12 21:46:39.000000000 -0500
> +++ mdadm-2.6.7.1/config.c	2009-01-05 18:35:17.477104526 -0600
> @@ -559,7 +559,7 @@ void mailfromline(char *line)
>  			alert_mail_from = strdup(w);
>  		else {
>  			char *t= NULL;
> -			asprintf(&t, "%s %s", alert_mail_from, w);
> +			xasprintf(&t, "%s %s", alert_mail_from, w);
>  			free(alert_mail_from);
>  			alert_mail_from = t;
>  		}
> diff -uprN mdadm-2.6.7.1.orig/mdadm.h mdadm-2.6.7.1/mdadm.h
> --- mdadm-2.6.7.1.orig/mdadm.h	2008-10-15 00:29:37.000000000 -0500
> +++ mdadm-2.6.7.1/mdadm.h	2009-01-05 18:49:34.061044664 -0600
> @@ -527,6 +527,17 @@ extern int open_mddev(char *dev, int aut
>  extern int open_mddev_devnum(char *devname, int devnum, char *name,
>  			     char *chosen_name, int parts);
>  
> +#include <assert.h>
> +#include <stdarg.h>
> +static inline int xasprintf(char **strp, const char *fmt, ...) {
> +	va_list ap;
> +	int ret;
> +	va_start(ap, fmt);
> +	ret = asprintf(strp, fmt, ap);
> +	va_end(ap);
> +	assert(ret >= 0);
> +	return ret;
> +}
>  
>  #define	LEVEL_MULTIPATH		(-4)
>  #define	LEVEL_LINEAR		(-1)





More information about the pkg-mdadm-devel mailing list