summaryrefslogtreecommitdiff
path: root/portable/asprintf.c
diff options
context:
space:
mode:
Diffstat (limited to 'portable/asprintf.c')
-rw-r--r--portable/asprintf.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/portable/asprintf.c b/portable/asprintf.c
index 7bdfd0d..eb2b713 100644
--- a/portable/asprintf.c
+++ b/portable/asprintf.c
@@ -21,6 +21,8 @@
#include <config.h>
#include <portable/system.h>
+#include <errno.h>
+
/*
* If we're running the test suite, rename the functions to avoid conflicts
* with the system versions.
@@ -33,6 +35,7 @@ int test_asprintf(char **, const char *, ...)
int test_vasprintf(char **, const char *, va_list);
#endif
+
int
asprintf(char **strp, const char *fmt, ...)
{
@@ -45,11 +48,12 @@ asprintf(char **strp, const char *fmt, ...)
return status;
}
+
int
vasprintf(char **strp, const char *fmt, va_list args)
{
va_list args_copy;
- int status, needed;
+ int status, needed, oerrno;
va_copy(args_copy, args);
needed = vsnprintf(NULL, 0, fmt, args_copy);
@@ -65,8 +69,10 @@ vasprintf(char **strp, const char *fmt, va_list args)
if (status >= 0)
return status;
else {
+ oerrno = errno;
free(*strp);
*strp = NULL;
+ errno = oerrno;
return status;
}
}