diff options
author | Luca Barbieri <[email protected]> | 2010-08-21 00:39:48 +0200 |
---|---|---|
committer | Luca Barbieri <[email protected]> | 2010-08-21 00:51:29 +0200 |
commit | 132b9439e287f1febbb49362671743a5b90e303c (patch) | |
tree | 85d25fda14ec0fdcc01aec12995c65f44093185f /src | |
parent | 9960200d5eef97e38d5565cfc1775e3d8f7800a2 (diff) |
os_stream: fix bugs in allocation path
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/auxiliary/os/os_stream.c | 24 |
1 files changed, 8 insertions, 16 deletions
diff --git a/src/gallium/auxiliary/os/os_stream.c b/src/gallium/auxiliary/os/os_stream.c index 2d4e1852ba4..7b9c17c5fae 100644 --- a/src/gallium/auxiliary/os/os_stream.c +++ b/src/gallium/auxiliary/os/os_stream.c @@ -9,28 +9,20 @@ os_default_stream_vprintf (struct os_stream* stream, const char *format, va_list { char buf[1024]; int retval; - - retval = util_vsnprintf(buf, sizeof(buf), format, ap); + va_list ap2; + va_copy(ap2, ap); + retval = util_vsnprintf(buf, sizeof(buf), format, ap2); + va_end(ap2); if(retval <= 0) {} else if(retval < sizeof(buf)) stream->write(stream, buf, retval); else { - int alloc = sizeof(buf); - char* str = NULL; - for(;;) - { - alloc += alloc; - if(str) - FREE(str); - str = MALLOC(alloc); - if(!str) - return -1; - - retval = util_vsnprintf(str, alloc, format, ap); - } while(retval >= alloc); - + char* str = MALLOC(retval + 1); + if(!str) + return -1; + retval = util_vsnprintf(str, retval + 1, format, ap); if(retval > 0) stream->write(stream, str, retval); FREE(str); |