Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 24 Nov 1999 00:50:53 -0700
From:      Warner Losh <imp@village.org>
To:        Brian Fundakowski Feldman <green@FreeBSD.ORG>
Cc:        Kris Kennaway <kris@hub.freebsd.org>, current@FreeBSD.ORG
Subject:   Re: Overflow in banner(1) 
Message-ID:  <199911240750.AAA18917@harmony.village.org>
In-Reply-To: Your message of "Wed, 24 Nov 1999 00:44:11 EST." <Pine.BSF.4.10.9911240033221.40905-100000@green.dyndns.org> 
References:  <Pine.BSF.4.10.9911240033221.40905-100000@green.dyndns.org>  

next in thread | previous in thread | raw e-mail | index | archive | help
In message <Pine.BSF.4.10.9911240033221.40905-100000@green.dyndns.org> Brian Fundakowski Feldman writes:
: I'd prefer something like this that I've attached.  The move over the
: years has been away from artificial limits...
: @@ -1058,14 +1058,24 @@
:  
:  	/* Have now read in the data. Next get the message to be printed. */
:  	if (*argv) {
: -		strcpy(message, *argv);
: +		message = strdup(*argv);
: +		if (message == NULL)
: +			err(1, "strdup");
:  		while (*++argv) {
: -			strcat(message, " ");
: -			strcat(message, *argv);
: +			char *omessage;
: +
: +			omessage = message;
: +			asprintf(&message, "%s %s", message, *argv);
: +			if (message == NULL)
: +				err(1, "asprintf");
: +			free(omessage);
:  		}
:  		nchars = strlen(message);
:  	} else {
:  		fprintf(stderr,"Message: ");
: +		message = malloc(MAXMSG);
: +		if (message == NULL)
: +			err(1, "malloc");
:  		(void)fgets(message, sizeof(message), stdin);
:  		nchars = strlen(message);
:  		message[nchars--] = '\0';	/* get rid of newline */

I'd have used the realloc primitive in place of the asprintf primitive
here to avoid too many calls to realloc/malloc.  Actually, it is
clearer and easier to understand if you precompute the length first
and malloc enough space.

	len = argc;	 (one each space, plus null at end)
	for (i = 1; i <= argc; i++)
		len += strlen(argv[i]);
	message = malloc(len);
	// original code here, maybe marked with /* XXX SAFE XXX */
	// to show that the code was reviewed at least once.

Warner



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199911240750.AAA18917>