diff --git a/utils/utils.c b/utils/utils.c
index b38292fc36ccea35e2d11cc4ddc4cb9f458b4620..f6da457c98a78496434e71c965f52e32d76ec249 100644
--- a/utils/utils.c
+++ b/utils/utils.c
@@ -429,6 +429,22 @@ xcalloc( size_t n, size_t size )
     return ret;
 }
 
+int
+xasprintf( char **dest, const char *format, ...)
+{
+    int ret;
+    va_list ap;
+
+    va_start( ap, format );
+    ret = vasprintf( dest, format, ap );
+    va_end( ap );
+
+    if( ret < 0 )
+        oom();
+
+    return ret;
+}
+
 /*
  * _capsule_set_error_literal:
  * @code_dest: (out) (optional): used to return an errno value
diff --git a/utils/utils.h b/utils/utils.h
index 7db98bac15744617a1eb130f62d1b9cf3d9389ec..1947cb0f3c6fc50ed9bf57aa2505e2e9364ea828 100644
--- a/utils/utils.h
+++ b/utils/utils.h
@@ -88,6 +88,7 @@ void oom( void ) __attribute__((noreturn));
 char *xstrdup( const char *s );
 void *xrealloc( void *ptr, size_t size ) __attribute__((alloc_size(2)));
 void *xcalloc( size_t n, size_t size ) __attribute__((alloc_size(1, 2), malloc));
+int xasprintf( char **s, const char *format, ...) __attribute__((format(printf, 2, 3)));
 
 /*
  * _capsule_steal_pointer: