Memory leak in vsnprintf
Jeff Johnston
jjohnstn@redhat.com
Thu Mar 16 15:57:00 GMT 2006
Yes, there was a problem. What was happening is that a fake file is
made for the string I/O functions and the buffer is set to the input
string pointer. Later on, a macro checking for writability was noticing
the buffer was NULL and was calling a function that allocated a new
buffer. We don't want to do this for string I/O functions (excepting
asprintf family).
I have just checked in a patch to libc/stdio/wsetup.c.
-- Jeff J.
Paul Mattes wrote:
> I believe I have found a memory leak in the newlib version of
> vsnprintf(). If it is called with a NULL 'str' parameter and a 0
> 'length', it leaks a BUFSIZ-sized buffer. (Per C99 and SUSv3, calling
> vsnprintf() with a NULL 'str' and 0 'length' is a way to find out how
> big the formatted string would be without actually storing it anywhere.)
>
> Here is an example program:
>
> #include <stdio.h>
> #include <stdarg.h>
>
> int
> waste_it(char *fmt, ...)
> {
> int ns;
> va_list a;
>
> va_start(a, fmt);
> ns = vsnprintf(NULL, 0, fmt, a);
> va_end(a);
> return ns;
> }
>
> main(int argc, char *argv[])
> {
> int i;
> int n;
>
> for (i = 0; i < 10000; i++) {
> n += waste_it("%s foo %d", "hello", 49);
> }
> }
>
> This program will consume quite a lot of memory on Cygwin, which is
> where it was first reported to me.
>
More information about the Newlib
mailing list