Bug in _VFPRINTF_R

Jeff Johnston jjohnstn@redhat.com
Mon Sep 17 18:35:00 GMT 2007


Ok.  Thank Eric.

-- Jeff J.

Eric Blake wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> According to Samuel Vinson on 9/15/2007 6:34 AM:
>> I'm sorry Eric, but I gave you a specific example :
>>    printf("%.*s\n",len,(char *)NULL) /* len = 0 */
>>
>> and not printf("%s", (char *)NULL)
> 
> OK, I see what you are complaining about (this was the first time you
> explicitly mentioned the case where precision is less than 6).  Indeed, as
> long as newlib is providing an extension for a replacement string for
> NULL, it should take precision into account.  Jeff, okay to apply this
> patch?  [However, I still maintain that your code has a bug for expecting
> any sane behavior when passing a NULL argument for %s.]
> 
> 2007-09-15  Eric Blake  <ebb9@byu.net>
> 
> 	* libc/stdio/vfprintf.c (_VFPRINTF_R): Take precision into account
> 	for %s on NULL.  Skip NULL check when optimizing for size.
> 
> - --
> Don't work too hard, make some time for fun as well!
> 
> Eric Blake             ebb9@byu.net
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.5 (Cygwin)
> Comment: Public key at home.comcast.net/~ericblake/eblake.gpg
> Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
> 
> iD8DBQFG6+u284KuGfSFAYARApoRAJ9xgjM2EC8Ha9qGwwPLOLP9xwg3ngCaAt8H
> dyartGnGWzIOZpmy39Kh0UU=
> =zDW1
> -----END PGP SIGNATURE-----
> 
> 
> ------------------------------------------------------------------------
> 
> Index: libc/stdio/vfprintf.c
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/stdio/vfprintf.c,v
> retrieving revision 1.65
> diff -u -p -r1.65 vfprintf.c
> --- libc/stdio/vfprintf.c	19 Jul 2007 03:42:21 -0000	1.65
> +++ libc/stdio/vfprintf.c	15 Sep 2007 14:22:54 -0000
> @@ -1029,10 +1029,20 @@ reswitch:	switch (ch) {
>  		case 'S':
>  #endif
>  			sign = '\0';
> -			if ((cp = GET_ARG (N, ap, char_ptr_t)) == NULL) {
> +			cp = GET_ARG (N, ap, char_ptr_t);
> +#ifndef __OPTIMIZE_SIZE__
> +			/* Behavior is undefined if the user passed a
> +			   NULL string.  However, if we are not
> +			   optimizing for size, we might as well
> +			   mirror glibc behavior.  */
> +			if (cp == NULL) {
>  				cp = "(null)";
> -				size = 6;
> +				if (prec == -1 || prec > 6)
> +					size = 6;
> +				else
> +					size = prec;
>  			}
> +#endif
>  #ifdef _MB_CAPABLE
>  			else if (ch == 'S' || (flags & LONGINT)) {
>  				mbstate_t ps;



More information about the Newlib mailing list