summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuca Barbieri <[email protected]>2010-08-21 00:39:48 +0200
committerLuca Barbieri <[email protected]>2010-08-21 00:51:29 +0200
commit132b9439e287f1febbb49362671743a5b90e303c (patch)
tree85d25fda14ec0fdcc01aec12995c65f44093185f
parent9960200d5eef97e38d5565cfc1775e3d8f7800a2 (diff)
os_stream: fix bugs in allocation path
-rw-r--r--src/gallium/auxiliary/os/os_stream.c24
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);