diff --git a/include/asterisk/stringfields.h b/include/asterisk/stringfields.h
index 02811a61121629ff2b00fa528c52766d01165b04..5631682b2abfdec4b882f2529e0fdb708603f1c9 100644
--- a/include/asterisk/stringfields.h
+++ b/include/asterisk/stringfields.h
@@ -143,8 +143,22 @@ int __ast_string_field_init(struct ast_string_field_pool *pool, size_t size,
   and the existing fields stored there will be updated to point
   into the new pool.
 */
-char *__ast_string_field_alloc_space(struct ast_string_field_pool *pool, size_t needed,
-				     ast_string_field *fields, int num_fields);
+ast_string_field __ast_string_field_alloc_space(struct ast_string_field_pool *pool, size_t needed,
+						ast_string_field *fields, int num_fields);
+
+/*!
+  \internal
+  \brief Set a field to a complex (built) value
+  \param pool Pointer to the pool structure
+  \param fields Pointer to the first entry of the field array
+  \param num_fields Number of fields in the array
+  \param index Index position of the field within the structure
+  \param format printf-style format string
+  \return nothing
+*/
+void __ast_string_field_index_build(struct ast_string_field_pool *pool,
+				    ast_string_field *fields, int num_fields,
+				    int index, const char *format, ...);
 
 /*!
   The default amount of storage to be allocated for a field pool.
@@ -216,23 +230,18 @@ char *__ast_string_field_alloc_space(struct ast_string_field_pool *pool, size_t
 	ast_string_field_index_set(x, ast_string_field_index(x, field), data)
 
 /*!
-  \brief Set a field to a simple complex (built) value
+  \brief Set a field to a complex (built) value
   \param x Pointer to a structure containing fields
   \param index Index position of the field within the structure
   \param fmt printf-style format string
   \param args Arguments for format string
   \return nothing
 */
-#define ast_string_field_index_build(x, index, fmt, args...) do { \
-	char s; \
-	size_t needed; \
-	needed = snprintf(&s, 1, fmt, args) + 1; \
-	if ((x->__begin_field[index] = __ast_string_field_alloc_space(&x->__field_pool, needed, &x->__begin_field[0], ast_string_field_count(x)))) \
-		sprintf((char *) x->__begin_field[index], fmt, args); \
-	} while (0)
+#define ast_string_field_index_build(x, index, fmt, args...) \
+	__ast_string_field_index_build(&x->__field_pool, &x->__begin_field[0], ast_string_field_count(x), index, fmt, args)
 
 /*!
-  \brief Set a field to a simple complex (built) value
+  \brief Set a field to a complex (built) value
   \param x Pointer to a structure containing fields
   \param field Name of the field to set
   \param fmt printf-style format string
diff --git a/utils.c b/utils.c
index df2e393eb7606b2bf311331617df460f074c19fe..cc351054186fec0c2cd57626d3c8ec050aab7ad8 100644
--- a/utils.c
+++ b/utils.c
@@ -943,8 +943,8 @@ int __ast_string_field_init(struct ast_string_field_pool *pool, size_t size,
 	return pool->base ? 0 : -1;
 }
 
-char *__ast_string_field_alloc_space(struct ast_string_field_pool *pool, size_t needed,
-				     ast_string_field *fields, int num_fields)
+ast_string_field __ast_string_field_alloc_space(struct ast_string_field_pool *pool, size_t needed,
+						ast_string_field *fields, int num_fields)
 {
 	char *result = NULL;
 
@@ -974,3 +974,24 @@ char *__ast_string_field_alloc_space(struct ast_string_field_pool *pool, size_t
 	pool->space -= needed;
 	return result;
 }
+
+void __ast_string_field_index_build(struct ast_string_field_pool *pool,
+				    ast_string_field *fields, int num_fields,
+				    int index, const char *format, ...)
+{
+	char s;
+	size_t needed;
+	va_list ap1, ap2;
+
+	va_start(ap1, format);
+	va_copy(ap2, ap1);
+
+	needed = vsnprintf(&s, 1, format, ap1) + 1;
+
+	va_end(ap1);
+
+	if ((fields[index] = __ast_string_field_alloc_space(pool, needed, fields, num_fields)))
+		vsprintf((char *) fields[index], format, ap2);
+
+	va_end(ap2);
+}