1 From ae6c9a5e612c343dd307fe34a1a282b7a4f17a5c Mon Sep 17 00:00:00 2001
2 From: Julian Bouzas <julian.bouzas@collabora.com>
3 Date: Wed, 9 Feb 2022 07:59:59 -0500
4 Subject: [PATCH 3/3] spa-json: fix va_list APIs for different architectures
6 The va_list type might not always be a pointer in some architectures, so we
7 cannot guarantee it will be modified after using it for a second time in another
8 function. This fixes the issue by using macros so args does not get copied, and
9 always gets modified when using it more than once.
11 Upstream-Status: Backport
13 lib/wp/spa-json.c | 156 ++++++++++++++++++++++++----------------------
14 1 file changed, 80 insertions(+), 76 deletions(-)
16 diff --git a/lib/wp/spa-json.c b/lib/wp/spa-json.c
17 index f14f395..c5e59a3 100644
18 --- a/lib/wp/spa-json.c
19 +++ b/lib/wp/spa-json.c
20 @@ -363,33 +363,33 @@ wp_spa_json_new_string (const gchar *value)
21 wp_spa_json_builder_new_formatted ("\"%s\"", value));
25 -wp_spa_json_builder_add_value (WpSpaJsonBuilder *self, const gchar *fmt,
30 - wp_spa_json_builder_add_null (self);
33 - wp_spa_json_builder_add_boolean (self, va_arg(args, gboolean));
36 - wp_spa_json_builder_add_int (self, va_arg(args, gint));
39 - wp_spa_json_builder_add_float (self, (float)va_arg(args, double));
42 - wp_spa_json_builder_add_string (self, va_arg(args, const gchar *));
45 - wp_spa_json_builder_add_json (self, va_arg(args, WpSpaJson *));
51 +/* Args is not a pointer in some architectures, so this needs to be a macro to
52 + * avoid args being copied */
53 +#define wp_spa_json_builder_add_value(self,fmt,args) \
57 + wp_spa_json_builder_add_null (self); \
60 + wp_spa_json_builder_add_boolean (self, va_arg(args, gboolean)); \
63 + wp_spa_json_builder_add_int (self, va_arg(args, gint)); \
66 + wp_spa_json_builder_add_float (self, (float)va_arg(args, double)); \
69 + wp_spa_json_builder_add_string (self, va_arg(args, const gchar *)); \
72 + wp_spa_json_builder_add_json (self, va_arg(args, WpSpaJson *)); \
80 * \brief Creates a spa json of type array
81 @@ -724,48 +724,46 @@ wp_spa_json_parse_object_valist (WpSpaJson *self, va_list args)
86 -wp_spa_json_parse_value (const gchar *data, int len, const gchar *fmt,
91 - if (!spa_json_is_null (data, len))
95 - if (!wp_spa_json_parse_boolean_internal (data, len,
96 - va_arg(args, gboolean *)))
100 - if (spa_json_parse_int (data, len, va_arg(args, gint *)) < 0)
104 - if (spa_json_parse_float (data, len,
105 - (float *)va_arg(args, double *)) < 0)
109 - gchar *str = wp_spa_json_parse_string_internal (data, len);
112 - *va_arg(args, gchar **) = str;
116 - WpSpaJson *j = wp_spa_json_new (data, len);
119 - *va_arg(args, WpSpaJson **) = j;
127 +/* Args is not a pointer in some architectures, so this needs to be a macro to
128 + * avoid args being copied */
129 +#define wp_spa_json_parse_value(data,len,fmt,args) \
133 + if (!spa_json_is_null (data, len)) \
137 + if (!wp_spa_json_parse_boolean_internal (data, len, \
138 + va_arg(args, gboolean *))) \
142 + if (spa_json_parse_int (data, len, va_arg(args, gint *)) < 0) \
146 + if (spa_json_parse_float (data, len, va_arg(args, float *)) < 0) \
150 + gchar *str = wp_spa_json_parse_string_internal (data, len); \
153 + *va_arg(args, gchar **) = str; \
157 + WpSpaJson *j = wp_spa_json_new (data, len); \
160 + *va_arg(args, WpSpaJson **) = j; \
169 * \brief Parses the object property values of a spa json object
170 @@ -827,8 +825,7 @@ wp_spa_json_object_get_valist (WpSpaJson *self, va_list args)
171 value = g_value_get_boxed (&item);
173 if (g_strcmp0 (key_str, lookup_key) == 0) {
174 - if (!wp_spa_json_parse_value (value->data, value->size, lookup_fmt, args))
176 + wp_spa_json_parse_value (value->data, value->size, lookup_fmt, args);
177 lookup_key = va_arg(args, const gchar *);
180 @@ -1366,9 +1363,12 @@ gboolean
181 wp_spa_json_parser_get_value (WpSpaJsonParser *self, const gchar *fmt,
184 - return wp_spa_json_parser_advance (self) &&
185 - wp_spa_json_parse_value (self->curr.cur,
186 - self->curr.end - self->curr.cur, fmt, args);
187 + if (wp_spa_json_parser_advance (self)) {
188 + wp_spa_json_parse_value (self->curr.cur, self->curr.end - self->curr.cur,
196 @@ -1419,9 +1419,13 @@ wp_spa_json_parser_get_valist (WpSpaJsonParser *self, va_list args)
201 - if (!wp_spa_json_parser_get_value (self, format, args))
203 + if (!wp_spa_json_parser_advance (self))
207 + wp_spa_json_parse_value (self->curr.cur, self->curr.end - self->curr.cur,