os_stream: fix bugs in allocation path

This commit is contained in:
Luca Barbieri 2010-08-21 00:39:48 +02:00
parent 9960200d5e
commit 132b9439e2
1 changed files with 8 additions and 16 deletions

View File

@ -9,28 +9,20 @@ os_default_stream_vprintf (struct os_stream* stream, const char *format, va_list
{ {
char buf[1024]; char buf[1024];
int retval; int retval;
va_list ap2;
retval = util_vsnprintf(buf, sizeof(buf), format, ap); va_copy(ap2, ap);
retval = util_vsnprintf(buf, sizeof(buf), format, ap2);
va_end(ap2);
if(retval <= 0) if(retval <= 0)
{} {}
else if(retval < sizeof(buf)) else if(retval < sizeof(buf))
stream->write(stream, buf, retval); stream->write(stream, buf, retval);
else else
{ {
int alloc = sizeof(buf); char* str = MALLOC(retval + 1);
char* str = NULL;
for(;;)
{
alloc += alloc;
if(str)
FREE(str);
str = MALLOC(alloc);
if(!str) if(!str)
return -1; return -1;
retval = util_vsnprintf(str, retval + 1, format, ap);
retval = util_vsnprintf(str, alloc, format, ap);
} while(retval >= alloc);
if(retval > 0) if(retval > 0)
stream->write(stream, str, retval); stream->write(stream, str, retval);
FREE(str); FREE(str);