* libc/stdio/nano-vfprintf_i.c (_printf_i): Use Newlib approach to

handle string that might be not nul-terminated.
	* testsuite/newlib.stdio/nulprintf.c: New test.
This commit is contained in:
Corinna Vinschen 2014-11-06 11:08:14 +00:00
parent 3a4fcef804
commit 97e2f27aa1
3 changed files with 32 additions and 9 deletions

View File

@ -1,3 +1,9 @@
2014-11-06 Terry Guo <terry.guo@arm.com>
* libc/stdio/nano-vfprintf_i.c (_printf_i): Use Newlib approach to
handle string that might be not nul-terminated.
* testsuite/newlib.stdio/nulprintf.c: New test.
2014-10-29 Jon Turney <jon.turney@dronecode.org.uk>
* libc/include/string.h: Correct guard for strcasecmp().

View File

@ -211,15 +211,15 @@ number:
case 's':
cp = GET_ARG (N, *ap, char_ptr_t);
/* Precision gives the maximum number of chars to be written from a
string, and take prec == -1 into consideration. */
if ((u_int)(pdata->size = strlen (cp)) > (u_int)(pdata->prec))
string, and take prec == -1 into consideration.
Use normal Newlib approach here to support case where cp is not
nul-terminated. */
char *p = memchr (cp, 0, pdata->prec);
if (p != NULL)
pdata->prec = p - cp;
pdata->size = pdata->prec;
/* Below code is kept for reading. The check is redundant because
pdata->prec will be set to pdata->size if it is -1 previously. */
#if 0
if (pdata->prec > pdata->size)
#endif
pdata->prec = pdata->size;
goto non_number_nosign;
default:
/* "%?" prints ?, unless ? is NUL. */

View File

@ -0,0 +1,17 @@
/*
* Copyright (C) 2014 by ARM Ltd. All rights reserved.
*
* Permission to use, copy, modify, and distribute this software
* is freely granted, provided that this notice is preserved.
*/
#include <stdio.h>
#include "check.h"
const char m[8] = {'M','M','M','M','M','M','M','M'};
int main()
{
printf ("%.*s\n", 8, m);
exit (0);
}