diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2013-02-07 16:06:54 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2013-02-07 16:06:54 +0100 |
commit | b5fc51198bf451885e6411bae9b25890a5b6fbe2 (patch) | |
tree | bd7f73b6fee12c29f896d5a126622de005ca2c89 | |
parent | ba76b7a40b929878833731f76306b1c977cc8650 (diff) | |
download | busybox-w32-b5fc51198bf451885e6411bae9b25890a5b6fbe2.tar.gz busybox-w32-b5fc51198bf451885e6411bae9b25890a5b6fbe2.tar.bz2 busybox-w32-b5fc51198bf451885e6411bae9b25890a5b6fbe2.zip |
vasprintf: do not use xmalloc, it will deadlock on OOM
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | libbb/platform.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/libbb/platform.c b/libbb/platform.c index 2bf34f5bc..d241d25a7 100644 --- a/libbb/platform.c +++ b/libbb/platform.c | |||
@@ -28,14 +28,16 @@ int FAST_FUNC vasprintf(char **string_ptr, const char *format, va_list p) | |||
28 | r = vsnprintf(buf, 128, format, p); | 28 | r = vsnprintf(buf, 128, format, p); |
29 | va_end(p); | 29 | va_end(p); |
30 | 30 | ||
31 | /* Note: can't use xstrdup/xmalloc, they call vasprintf (us) on failure! */ | ||
32 | |||
31 | if (r < 128) { | 33 | if (r < 128) { |
32 | va_end(p2); | 34 | va_end(p2); |
33 | *string_ptr = xstrdup(buf); | 35 | *string_ptr = strdup(buf); |
34 | return r; | 36 | return r; |
35 | } | 37 | } |
36 | 38 | ||
37 | *string_ptr = xmalloc(r+1); | 39 | *string_ptr = malloc(r+1); |
38 | r = vsnprintf(*string_ptr, r+1, format, p2); | 40 | r = (*string_ptr ? vsnprintf(*string_ptr, r+1, format, p2) : -1); |
39 | va_end(p2); | 41 | va_end(p2); |
40 | 42 | ||
41 | return r; | 43 | return r; |