r13397: Propagate the error return from vsnprintf to trap the case where
authorJames Peach <jpeach@samba.org>
Wed, 8 Feb 2006 23:44:17 +0000 (23:44 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:51:52 +0000 (13:51 -0500)
we aren't linked against a C99 vsnprintf.

source/lib/talloc/talloc.c

index ac2fedebdc01fde7e1ad1ce028da267a9860c9f1..6b3328420de93ec06f3b309ff73f669843456092 100644 (file)
@@ -1011,7 +1011,9 @@ char *talloc_vasprintf(const void *t, const char *fmt, va_list ap)
        
        VA_COPY(ap2, ap);
 
-       len = vsnprintf(NULL, 0, fmt, ap2);
+       if ((len = vsnprintf(NULL, 0, fmt, ap2)) <= 0) {
+               return NULL;
+       }
 
        ret = _talloc(t, len+1);
        if (ret) {
@@ -1060,7 +1062,15 @@ char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap)
        VA_COPY(ap2, ap);
 
        s_len = tc->size - 1;
-       len = vsnprintf(NULL, 0, fmt, ap2);
+       if ((len = vsnprintf(NULL, 0, fmt, ap2)) <= 0) {
+               /* Either the vsnprintf failed or the format resulted in
+                * no characters being formatted. In the former case, we
+                * ought to return NULL, in the latter we ought to return
+                * the original string. Most current callers of this 
+                * function expect it to never return NULL.
+                */
+               return s;
+       }
 
        s = talloc_realloc(NULL, s, char, s_len + len+1);
        if (!s) return NULL;