os_stream: fix bugs in allocation path
This commit is contained in:
parent
9960200d5e
commit
132b9439e2
|
@ -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;
|
if(!str)
|
||||||
for(;;)
|
return -1;
|
||||||
{
|
retval = util_vsnprintf(str, retval + 1, format, ap);
|
||||||
alloc += alloc;
|
|
||||||
if(str)
|
|
||||||
FREE(str);
|
|
||||||
str = MALLOC(alloc);
|
|
||||||
if(!str)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
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);
|
||||||
|
|
Loading…
Reference in New Issue