1 From e429db7e8c266045aee25e153fb2308bd61fe233 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] 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 lib/wp/spa-json.c | 156 ++++++++++++++++++++++++----------------------
12 1 file changed, 80 insertions(+), 76 deletions(-)
14 diff --git a/lib/wp/spa-json.c b/lib/wp/spa-json.c
15 index f14f395d..c5e59a3e 100644
16 --- a/lib/wp/spa-json.c
17 +++ b/lib/wp/spa-json.c
18 @@ -363,33 +363,33 @@ wp_spa_json_new_string (const gchar *value)
19 wp_spa_json_builder_new_formatted ("\"%s\"", value));
23 -wp_spa_json_builder_add_value (WpSpaJsonBuilder *self, const gchar *fmt,
28 - wp_spa_json_builder_add_null (self);
31 - wp_spa_json_builder_add_boolean (self, va_arg(args, gboolean));
34 - wp_spa_json_builder_add_int (self, va_arg(args, gint));
37 - wp_spa_json_builder_add_float (self, (float)va_arg(args, double));
40 - wp_spa_json_builder_add_string (self, va_arg(args, const gchar *));
43 - wp_spa_json_builder_add_json (self, va_arg(args, WpSpaJson *));
49 +/* Args is not a pointer in some architectures, so this needs to be a macro to
50 + * avoid args being copied */
51 +#define wp_spa_json_builder_add_value(self,fmt,args) \
55 + wp_spa_json_builder_add_null (self); \
58 + wp_spa_json_builder_add_boolean (self, va_arg(args, gboolean)); \
61 + wp_spa_json_builder_add_int (self, va_arg(args, gint)); \
64 + wp_spa_json_builder_add_float (self, (float)va_arg(args, double)); \
67 + wp_spa_json_builder_add_string (self, va_arg(args, const gchar *)); \
70 + wp_spa_json_builder_add_json (self, va_arg(args, WpSpaJson *)); \
78 * \brief Creates a spa json of type array
79 @@ -724,48 +724,46 @@ wp_spa_json_parse_object_valist (WpSpaJson *self, va_list args)
84 -wp_spa_json_parse_value (const gchar *data, int len, const gchar *fmt,
89 - if (!spa_json_is_null (data, len))
93 - if (!wp_spa_json_parse_boolean_internal (data, len,
94 - va_arg(args, gboolean *)))
98 - if (spa_json_parse_int (data, len, va_arg(args, gint *)) < 0)
102 - if (spa_json_parse_float (data, len,
103 - (float *)va_arg(args, double *)) < 0)
107 - gchar *str = wp_spa_json_parse_string_internal (data, len);
110 - *va_arg(args, gchar **) = str;
114 - WpSpaJson *j = wp_spa_json_new (data, len);
117 - *va_arg(args, WpSpaJson **) = j;
125 +/* Args is not a pointer in some architectures, so this needs to be a macro to
126 + * avoid args being copied */
127 +#define wp_spa_json_parse_value(data,len,fmt,args) \
131 + if (!spa_json_is_null (data, len)) \
135 + if (!wp_spa_json_parse_boolean_internal (data, len, \
136 + va_arg(args, gboolean *))) \
140 + if (spa_json_parse_int (data, len, va_arg(args, gint *)) < 0) \
144 + if (spa_json_parse_float (data, len, va_arg(args, float *)) < 0) \
148 + gchar *str = wp_spa_json_parse_string_internal (data, len); \
151 + *va_arg(args, gchar **) = str; \
155 + WpSpaJson *j = wp_spa_json_new (data, len); \
158 + *va_arg(args, WpSpaJson **) = j; \
167 * \brief Parses the object property values of a spa json object
168 @@ -827,8 +825,7 @@ wp_spa_json_object_get_valist (WpSpaJson *self, va_list args)
169 value = g_value_get_boxed (&item);
171 if (g_strcmp0 (key_str, lookup_key) == 0) {
172 - if (!wp_spa_json_parse_value (value->data, value->size, lookup_fmt, args))
174 + wp_spa_json_parse_value (value->data, value->size, lookup_fmt, args);
175 lookup_key = va_arg(args, const gchar *);
178 @@ -1366,9 +1363,12 @@ gboolean
179 wp_spa_json_parser_get_value (WpSpaJsonParser *self, const gchar *fmt,
182 - return wp_spa_json_parser_advance (self) &&
183 - wp_spa_json_parse_value (self->curr.cur,
184 - self->curr.end - self->curr.cur, fmt, args);
185 + if (wp_spa_json_parser_advance (self)) {
186 + wp_spa_json_parse_value (self->curr.cur, self->curr.end - self->curr.cur,
194 @@ -1419,9 +1419,13 @@ wp_spa_json_parser_get_valist (WpSpaJsonParser *self, va_list args)
199 - if (!wp_spa_json_parser_get_value (self, format, args))
201 + if (!wp_spa_json_parser_advance (self))
205 + wp_spa_json_parse_value (self->curr.cur, self->curr.end - self->curr.cur,