This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Bug (?) in sprintf family?




Eric Blake wrote:
Eric Blake <ebb9 <at> byu.net> writes:

It seems like the fix would be making sure that in vfprintf.c, when __SMBF is set, __sprint_r must allocate a string even if it will not be populating it, since asprintf.c depends on the string being pre-allocated large enough to
hold
the trailing NUL.

Yep. The old __sprint_r calls __sfvwrite_r calls cantwrite calls __smakebuf_r which always mallocs a string the first time through asprintf, but the new __sprint_r lacks this malloc. Fixed as follows, as well as catching all remaining string-based printf functions that don't need full I/O baggage at link time. Okay to apply?



Yes. Thanks for fixing this.


-- Jeff J.
2008-04-29 Eric Blake <ebb9@byu.net>

	Fix 2008-04-14 regression in asprintf(ptr,"").
	* libc/stdio/asnprintf.c (asnprintf, _asnprintf_r): Avoid stdio
	baggage.
	* libc/stdio/asniprintf.c (asniprintf, _asniprintf_r): Likewise.
	* libc/stdio/asiprintf.c (asiprintf, _asiprintf_r): Likewise.
	* libc/stdio/vasniprintf.c (_vasniprintf_r): Likewise.
	* libc/stdio/vsnprintf.c (_vsnprintf_r): Likewise.
	* libc/stdio/vfprintf.c (__sprint_r) [STRING_ONLY]: Always malloc
	an initial buffer for asprintf.


Index: libc/stdio/asiprintf.c
===================================================================
RCS file: /cvs/src/src/newlib/libc/stdio/asiprintf.c,v
retrieving revision 1.4
diff -u -p -r1.4 asiprintf.c
--- libc/stdio/asiprintf.c 4 May 2007 02:55:16 -0000 1.4
+++ libc/stdio/asiprintf.c 29 Apr 2008 22:59:43 -0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1990, 2007 The Regents of the University of California.
+ * Copyright (c) 1990 The Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms are permitted
@@ -40,7 +40,7 @@ _DEFUN(_asiprintf_r, (ptr, strp, fmt),
f._bf._size = f._w = 0;
f._file = -1; /* No file. */
va_start (ap, fmt);
- ret = _vfiprintf_r (ptr, &f, fmt, ap);
+ ret = _svfiprintf_r (ptr, &f, fmt, ap);
va_end (ap);
if (ret >= 0)
{
@@ -67,7 +67,7 @@ _DEFUN(asiprintf, (strp, fmt),
f._bf._size = f._w = 0;
f._file = -1; /* No file. */
va_start (ap, fmt);
- ret = _vfiprintf_r (_REENT, &f, fmt, ap);
+ ret = _svfiprintf_r (_REENT, &f, fmt, ap);
va_end (ap);
if (ret >= 0)
{
Index: libc/stdio/asniprintf.c
===================================================================
RCS file: /cvs/src/src/newlib/libc/stdio/asniprintf.c,v
retrieving revision 1.2
diff -u -p -r1.2 asniprintf.c
--- libc/stdio/asniprintf.c 9 May 2007 19:27:30 -0000 1.2
+++ libc/stdio/asniprintf.c 29 Apr 2008 22:59:43 -0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007 Eric Blake
+/* Copyright (C) 2007, 2008 Eric Blake
* Permission to use, copy, modify, and distribute this software
* is freely granted, provided that this notice is preserved.
*/
@@ -48,7 +48,7 @@ _DEFUN(_asniprintf_r, (ptr, buf, lenp, f
f._bf._size = f._w = len;
f._file = -1; /* No file. */
va_start (ap, fmt);
- ret = _vfiprintf_r (ptr, &f, fmt, ap);
+ ret = _svfiprintf_r (ptr, &f, fmt, ap);
va_end (ap);
if (ret < 0)
return NULL;
@@ -95,7 +95,7 @@ _DEFUN(asniprintf, (buf, lenp, fmt),
f._bf._size = f._w = len;
f._file = -1; /* No file. */
va_start (ap, fmt);
- ret = _vfiprintf_r (ptr, &f, fmt, ap);
+ ret = _svfiprintf_r (ptr, &f, fmt, ap);
va_end (ap);
if (ret < 0)
return NULL;
Index: libc/stdio/asnprintf.c
===================================================================
RCS file: /cvs/src/src/newlib/libc/stdio/asnprintf.c,v
retrieving revision 1.2
diff -u -p -r1.2 asnprintf.c
--- libc/stdio/asnprintf.c 9 May 2007 19:27:30 -0000 1.2
+++ libc/stdio/asnprintf.c 29 Apr 2008 22:59:43 -0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007 Eric Blake
+/* Copyright (C) 2007, 2008 Eric Blake
* Permission to use, copy, modify, and distribute this software
* is freely granted, provided that this notice is preserved.
*/
@@ -48,7 +48,7 @@ _DEFUN(_asnprintf_r, (ptr, buf, lenp, fm
f._bf._size = f._w = len;
f._file = -1; /* No file. */
va_start (ap, fmt);
- ret = _vfprintf_r (ptr, &f, fmt, ap);
+ ret = _svfprintf_r (ptr, &f, fmt, ap);
va_end (ap);
if (ret < 0)
return NULL;
@@ -95,7 +95,7 @@ _DEFUN(asnprintf, (buf, lenp, fmt),
f._bf._size = f._w = len;
f._file = -1; /* No file. */
va_start (ap, fmt);
- ret = _vfprintf_r (ptr, &f, fmt, ap);
+ ret = _svfprintf_r (ptr, &f, fmt, ap);
va_end (ap);
if (ret < 0)
return NULL;
Index: libc/stdio/vasniprintf.c
===================================================================
RCS file: /cvs/src/src/newlib/libc/stdio/vasniprintf.c,v
retrieving revision 1.2
diff -u -p -r1.2 vasniprintf.c
--- libc/stdio/vasniprintf.c 9 May 2007 19:27:30 -0000 1.2
+++ libc/stdio/vasniprintf.c 29 Apr 2008 22:59:43 -0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007 Eric Blake
+/* Copyright (C) 2007, 2008 Eric Blake
* Permission to use, copy, modify, and distribute this software
* is freely granted, provided that this notice is preserved.
*/
@@ -47,7 +47,7 @@ _DEFUN(_vasniprintf_r, (ptr, buf, lenp, }
f._bf._size = f._w = len;
f._file = -1; /* No file. */
- ret = _vfiprintf_r (ptr, &f, fmt, ap);
+ ret = _svfiprintf_r (ptr, &f, fmt, ap);
if (ret < 0)
return NULL;
*lenp = ret;
Index: libc/stdio/vfprintf.c
===================================================================
RCS file: /cvs/src/src/newlib/libc/stdio/vfprintf.c,v
retrieving revision 1.69
diff -u -p -r1.69 vfprintf.c
--- libc/stdio/vfprintf.c 14 Apr 2008 21:14:55 -0000 1.69
+++ libc/stdio/vfprintf.c 29 Apr 2008 22:59:43 -0000
@@ -178,6 +178,18 @@ _DEFUN(__sprint_r, (ptr, fp, uio),
register struct __siov *iov;
register _CONST char *p = NULL;
+ /* Check if we are called by asprintf family for initial buffer. */
+ if (fp->_flags & __SMBF && !fp->_bf._base)
+ {
+ fp->_bf._base = fp->_p = _malloc_r (ptr, 64);
+ if (!fp->_p)
+ {
+ ptr->_errno = ENOMEM;
+ goto err;
+ }
+ fp->_bf._size = 64;
+ }
+
iov = uio->uio_iov;
len = 0;
Index: libc/stdio/vsnprintf.c
===================================================================
RCS file: /cvs/src/src/newlib/libc/stdio/vsnprintf.c,v
retrieving revision 1.8
diff -u -p -r1.8 vsnprintf.c
--- libc/stdio/vsnprintf.c 4 Apr 2007 18:32:49 -0000 1.8
+++ libc/stdio/vsnprintf.c 29 Apr 2008 22:59:43 -0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1990, 2007 The Regents of the University of California.
+ * Copyright (c) 1990 The Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms are permitted
@@ -61,7 +61,7 @@ _DEFUN(_vsnprintf_r, (ptr, str, size, fm
f._bf._base = f._p = (unsigned char *) str;
f._bf._size = f._w = (size > 0 ? size - 1 : 0);
f._file = -1; /* No file. */
- ret = _vfprintf_r (ptr, &f, fmt, ap);
+ ret = _svfprintf_r (ptr, &f, fmt, ap);
if (ret < EOF)
ptr->_errno = EOVERFLOW;
if (size > 0)





Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]