# Use virAsprintf rather than as'printf since *strp is undefined on error.
sc_prohibit_asprintf:
- @prohibit='\<a[s]printf\>' \
+ @prohibit='\<v?a[s]printf\>' \
halt='use virAsprintf, not as'printf \
$(_sc_search_regexp)
return 0;
}
+/**
+ * virVasprintf
+ *
+ * like glibc's vasprintf but makes sure *strp == NULL on failure
+ */
+int
+virVasprintf(char **strp, const char *fmt, va_list list)
+{
+ int ret;
+
+ if ((ret = vasprintf(strp, fmt, list)) == -1)
+ *strp = NULL;
+
+ return ret;
+}
+
/**
* virAsprintf
*
int ret;
va_start(ap, fmt);
-
- if ((ret = vasprintf(strp, fmt, ap)) == -1)
- *strp = NULL;
-
+ ret = virVasprintf(strp, fmt, ap);
va_end(ap);
return ret;
}
# include <unistd.h>
# include <sys/select.h>
# include <sys/types.h>
+# include <stdarg.h>
# ifndef MIN
# define MIN(a, b) ((a) < (b) ? (a) : (b))
void virSkipSpaces(const char **str);
int virParseNumber(const char **str);
int virParseVersionString(const char *str, unsigned long *version);
-int virAsprintf(char **strp, const char *fmt, ...) ATTRIBUTE_FMT_PRINTF(2, 3);
+int virAsprintf(char **strp, const char *fmt, ...)
+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_FMT_PRINTF(2, 3);
+int virVasprintf(char **strp, const char *fmt, va_list list)
+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_FMT_PRINTF(2, 0);
char *virStrncpy(char *dest, const char *src, size_t n, size_t destbytes)
ATTRIBUTE_RETURN_CHECK;
char *virStrcpy(char *dest, const char *src, size_t destbytes)
#endif
va_start(args, fmt);
- if (vasprintf(&str, fmt, args) < 0) {
+ if (virVasprintf(&str, fmt, args) < 0) {
VIR_WARN0("Out of memory while formatting audit message");
str = NULL;
}