Subject: Re: bin/23210: usr.bin/make/util.c needs asprintf
To: Alan Barrett <apb@cequrux.com>
From: Dan McMahill <dmcmahill@NetBSD.org>
List: netbsd-bugs
Date: 10/21/2003 19:13:46
This patch compiles and seems to produce a working nbmake.  The rest of
the build still isn't there, but this is a big step.

-Dan

On Tue, 21 Oct 2003 10:16:50 +0200
Alan Barrett <apb@cequrux.com> wrote:

> On Mon, 20 Oct 2003, dmcmahill@NetBSD.org wrote:
> > Rev 1.81 from 2003/09/27 of usr.bin/make/var.c introduces the
> > use of asprintf() to make.  There should be an autoconf check
> > in src/tools/make/configure.ac as well as a portable asprintf()
> > implementation in usr.bin/make/util.c to allow cross building from
> > systems which do not have asprintf() such as solaris 2.6 with
> > gcc-2.95.1.
> 
> Please try the appended patch, which removes the use of asprintf()
> from make/var.c.
> 
> --apb (Alan Barrett)
> 
> Index: usr.bin/make/var.c
> --- var.c	27 Sep 2003 21:29:37 -0000	1.81
> +++ var.c	21 Oct 2003 08:02:09 -0000
> @@ -129,6 +129,7 @@
>  #endif
>  #include    <ctype.h>
>  #include    <stdlib.h>
> +#include    <limits.h>
>  
>  #include    "make.h"
>  #include    "buf.h"
> @@ -2489,9 +2490,22 @@
>  			goto bad_modifier;
>  		    } else if (estr[0] == '#' && estr[1] == '\0') {
>  			/* Found ":[#]" */
> -			if (parsestate.oneBigWord)
> -			    asprintf(&newStr, "1");
> -			else {
> +
> +			/*
> +			 * We will need enough space for the decimal
> +			 * representation of an int.  We calculate the
> +			 * space needed for the octal representation,
> +			 * and add enough slop to cope with a '-' sign
> +			 * (which should never be needed) and a '\0'
> +			 * string terminator.
> +			 */
> +			int newStrSize =
> +				(sizeof(int) * CHAR_BIT + 2) / 3 + 2;
> +
> +			newStr = emalloc(newStrSize);
> +			if (parsestate.oneBigWord) {
> +			    strncpy(newStr, "1", newStrSize);
> +			} else {
>  			    /* XXX: brk_string() is a rather expensive
>  			     * way of counting words. */
>  			    char **av;
> @@ -2499,7 +2513,7 @@
>  			    int ac;
>  
>  			    av = brk_string(nstr, &ac, FALSE, &as);
> -			    asprintf(&newStr, "%d", ac);
> +			    snprintf(newStr, newStrSize,  "%d", ac);
>  			    free(as);
>  			    free(av);
>  			}
> 


--