diff --git a/shared/string-helpers.h b/shared/string-helpers.h
index c8ce4498cdbdf95eddff370fb1337bbadf4a0e62..e7174b21aabf5ec46be65118fdf83f4d777ca455 100644
--- a/shared/string-helpers.h
+++ b/shared/string-helpers.h
@@ -31,6 +31,8 @@
 #include <stdint.h>
 #include <errno.h>
 #include <assert.h>
+#include <stdarg.h>
+#include <stdio.h>
 
 /* Convert string to integer
  *
@@ -68,4 +70,29 @@ safe_strtoint(const char *str, int32_t *value)
 	return true;
 }
 
+/**
+ * Exactly like asprintf(), but sets *str_out to NULL if it fails.
+ *
+ * If str_out is NULL, does nothing.
+ */
+static inline void __attribute__ ((format (printf, 2, 3)))
+str_printf(char **str_out, const char *fmt, ...)
+{
+	char *msg;
+	va_list ap;
+	int ret;
+
+	if (!str_out)
+		return;
+
+	va_start(ap, fmt);
+	ret = vasprintf(&msg, fmt, ap);
+	va_end(ap);
+
+	if (ret >= 0)
+		*str_out = msg;
+	else
+		*str_out = NULL;
+}
+
 #endif /* WESTON_STRING_HELPERS_H */