* gpg.sgml: Document delsig. Clarify that --refresh-keys arguments are
[gnupg.git] / common / vasprintf.c
index dbef4eb..2af2d3a 100644 (file)
@@ -39,8 +39,15 @@ vasprintf (char **result, const char *format, va_list *args)
   int total_width = strlen (format) + 1;
   va_list ap;
 
-  /* FIXME: use va_copy() */
+#ifdef va_copy
+  va_copy (ap, args);
+#else
+#ifdef __va_copy
+  __va_copy (ap, args);
+#else
   memcpy (&ap, args, sizeof (va_list));
+#endif /* __va_copy */
+#endif /* va_copy */
 
   while (*p != '\0')
     {
@@ -68,7 +75,8 @@ vasprintf (char **result, const char *format, va_list *args)
            }
          while (strchr ("hlL", *p))
            ++p;
-         /* Should be big enough for any format specifier except %s and floats.  */
+         /* Should be big enough for any format specifier except %s
+             and floats.  */
          total_width += 30;
          switch (*p)
            {
@@ -92,7 +100,13 @@ vasprintf (char **result, const char *format, va_list *args)
              total_width += 307;
              break;
            case 's':
-             total_width += strlen (va_arg (ap, char *));
+              {
+                char *tmp = va_arg (ap, char *);
+                if (tmp)
+                  total_width += strlen (tmp);
+                else /* in case the vsprintf does prints a text */
+                  total_width += 25; /* e.g. "(null pointer reference)" */
+              }
              break;
            case 'p':
            case 'n':