diff options
-rw-r--r-- | libbb/xfuncs.c | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/libbb/xfuncs.c b/libbb/xfuncs.c index 7803afcec..3d0bec7ac 100644 --- a/libbb/xfuncs.c +++ b/libbb/xfuncs.c | |||
@@ -452,9 +452,9 @@ char *xasprintf(const char *format, ...) | |||
452 | { | 452 | { |
453 | va_list p; | 453 | va_list p; |
454 | int r; | 454 | int r; |
455 | char *string_ptr; | 455 | char *string_ptr = xmalloc(1024); |
456 | 456 | ||
457 | #if 1 | 457 | #if 0 |
458 | // GNU extension | 458 | // GNU extension |
459 | va_start(p, format); | 459 | va_start(p, format); |
460 | r = vasprintf(&string_ptr, format, p); | 460 | r = vasprintf(&string_ptr, format, p); |
@@ -462,26 +462,30 @@ char *xasprintf(const char *format, ...) | |||
462 | #else | 462 | #else |
463 | // Bloat for systems that haven't got the GNU extension. | 463 | // Bloat for systems that haven't got the GNU extension. |
464 | va_start(p, format); | 464 | va_start(p, format); |
465 | r = vsnprintf(NULL, 0, format, p); | 465 | r = vsnprintf(string_ptr, 1024, format, p); |
466 | va_end(p); | ||
467 | string_ptr = xmalloc(r+1); | ||
468 | va_start(p, format); | ||
469 | r = vsnprintf(string_ptr, r+1, format, p); | ||
470 | va_end(p); | 466 | va_end(p); |
467 | if (r > 0) { | ||
468 | free(string_ptr); | ||
469 | r += 2; | ||
470 | string_ptr = xmalloc(r); | ||
471 | va_start(p, format); | ||
472 | r = vsnprintf(string_ptr, r, format, p); | ||
473 | va_end(p); | ||
474 | } | ||
471 | #endif | 475 | #endif |
472 | 476 | ||
473 | if (r < 0) bb_error_msg_and_die(bb_msg_memory_exhausted); | 477 | if (r < 0) bb_error_msg_and_die(bb_msg_memory_exhausted); |
474 | return string_ptr; | 478 | return string_ptr; |
475 | } | 479 | } |
476 | 480 | ||
477 | #if 0 /* If we will ever meet a libc which hasn't [f]dprintf... */ | 481 | #ifdef __MINGW32__ /* If we will ever meet a libc which hasn't [f]dprintf... */ |
478 | int fdprintf(int fd, const char *format, ...) | 482 | int fdprintf(int fd, const char *format, ...) |
479 | { | 483 | { |
480 | va_list p; | 484 | va_list p; |
481 | int r; | 485 | int r; |
482 | char *string_ptr; | 486 | char *string_ptr = xmalloc(1024); |
483 | 487 | ||
484 | #if 1 | 488 | #if 0 |
485 | // GNU extension | 489 | // GNU extension |
486 | va_start(p, format); | 490 | va_start(p, format); |
487 | r = vasprintf(&string_ptr, format, p); | 491 | r = vasprintf(&string_ptr, format, p); |
@@ -489,12 +493,16 @@ int fdprintf(int fd, const char *format, ...) | |||
489 | #else | 493 | #else |
490 | // Bloat for systems that haven't got the GNU extension. | 494 | // Bloat for systems that haven't got the GNU extension. |
491 | va_start(p, format); | 495 | va_start(p, format); |
492 | r = vsnprintf(NULL, 0, format, p); | 496 | r = vsnprintf(string_ptr, 1024, format, p); |
493 | va_end(p); | ||
494 | string_ptr = xmalloc(r+1); | ||
495 | va_start(p, format); | ||
496 | r = vsnprintf(string_ptr, r+1, format, p); | ||
497 | va_end(p); | 497 | va_end(p); |
498 | if (r > 0) { | ||
499 | free(string_ptr); | ||
500 | r += 2; | ||
501 | string_ptr = xmalloc(r); | ||
502 | va_start(p, format); | ||
503 | r = vsnprintf(string_ptr, r, format, p); | ||
504 | va_end(p); | ||
505 | } | ||
498 | #endif | 506 | #endif |
499 | 507 | ||
500 | if (r >= 0) { | 508 | if (r >= 0) { |