[vlc-commits] vasprintf: rewrite. va_copy() was missing.
Rémi Denis-Courmont
git at videolan.org
Wed Oct 26 20:11:52 CEST 2011
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Wed Oct 26 21:11:12 2011 +0300| [59d3977bf0c30ceb2c8cd431c8e0e55de7ff3a93] | committer: Rémi Denis-Courmont
vasprintf: rewrite. va_copy() was missing.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=59d3977bf0c30ceb2c8cd431c8e0e55de7ff3a93
---
compat/vasprintf.c | 33 +++++++++++++++++++++++++++------
1 files changed, 27 insertions(+), 6 deletions(-)
diff --git a/compat/vasprintf.c b/compat/vasprintf.c
index 17b6d67..f2ab6da 100644
--- a/compat/vasprintf.c
+++ b/compat/vasprintf.c
@@ -25,13 +25,34 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
+#include <assert.h>
int vasprintf (char **strp, const char *fmt, va_list ap)
{
- ssize_t len = vsnprintf (NULL, 0, fmt, ap) + 1;
- char *res = malloc (len);
- if (res == NULL)
- return -1;
- *strp = res;
- return vsnprintf (res, len, fmt, ap);
+ va_list args;
+ int len;
+
+ va_copy (args, ap);
+ len = vsnprintf (NULL, 0, fmt, args);
+ va_end (args);
+
+ char *str = malloc (len + 1);
+ if (str != NULL)
+ {
+ int len2;
+
+ va_copy (args, ap);
+ len2 = vsprintf (str, fmt, ap);
+ assert (len2 == len);
+ va_end (args);
+ }
+ else
+ {
+ len = -1;
+#ifndef NDEBUG
+ str = (void *)(intptr_t)0x41414141; /* poison */
+#endif
+ }
+ *strp = str;
+ return len;
}
More information about the vlc-commits
mailing list