9d0c68d58c521427e2b2f5966aa33e543ecc26df
[AGL/meta-agl.git] / meta-pipewire / recipes-multimedia / wireplumber / wireplumber / 0003-spa-json-fix-va_list-APIs-for-different-architecture.patch
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
5
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.
10
11 Upstream-Status: Backport
12 ---
13  lib/wp/spa-json.c | 156 ++++++++++++++++++++++++----------------------
14  1 file changed, 80 insertions(+), 76 deletions(-)
15
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));
22  }
23  
24 -static void
25 -wp_spa_json_builder_add_value (WpSpaJsonBuilder *self, const gchar *fmt,
26 -    va_list args)
27 -{
28 -  switch (*fmt) {
29 -    case 'n':
30 -      wp_spa_json_builder_add_null (self);
31 -      break;
32 -    case 'b':
33 -      wp_spa_json_builder_add_boolean (self, va_arg(args, gboolean));
34 -      break;
35 -    case 'i':
36 -      wp_spa_json_builder_add_int (self, va_arg(args, gint));
37 -      break;
38 -    case 'f':
39 -      wp_spa_json_builder_add_float (self, (float)va_arg(args, double));
40 -      break;
41 -    case 's':
42 -      wp_spa_json_builder_add_string (self, va_arg(args, const gchar *));
43 -      break;
44 -    case 'J':
45 -      wp_spa_json_builder_add_json (self, va_arg(args, WpSpaJson *));
46 -      break;
47 -    default:
48 -      return;
49 -  }
50 -}
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)                           \
54 +do {                                                                           \
55 +  switch (*fmt) {                                                              \
56 +    case 'n':                                                                  \
57 +      wp_spa_json_builder_add_null (self);                                     \
58 +      break;                                                                   \
59 +    case 'b':                                                                  \
60 +      wp_spa_json_builder_add_boolean (self, va_arg(args, gboolean));          \
61 +      break;                                                                   \
62 +    case 'i':                                                                  \
63 +      wp_spa_json_builder_add_int (self, va_arg(args, gint));                  \
64 +      break;                                                                   \
65 +    case 'f':                                                                  \
66 +      wp_spa_json_builder_add_float (self, (float)va_arg(args, double));       \
67 +      break;                                                                   \
68 +    case 's':                                                                  \
69 +      wp_spa_json_builder_add_string (self, va_arg(args, const gchar *));      \
70 +      break;                                                                   \
71 +    case 'J':                                                                  \
72 +      wp_spa_json_builder_add_json (self, va_arg(args, WpSpaJson *));          \
73 +      break;                                                                   \
74 +    default:                                                                   \
75 +      break;                                                                   \
76 +  }                                                                           \
77 +} while(false)
78  
79  /*!
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)
82    return res;
83  }
84  
85 -static gboolean
86 -wp_spa_json_parse_value (const gchar *data, int len, const gchar *fmt,
87 -    va_list args)
88 -{
89 -  switch (*fmt) {
90 -    case 'n':
91 -      if (!spa_json_is_null (data, len))
92 -        return FALSE;
93 -      break;
94 -    case 'b':
95 -      if (!wp_spa_json_parse_boolean_internal (data, len,
96 -          va_arg(args, gboolean *)))
97 -        return FALSE;
98 -      break;
99 -    case 'i':
100 -      if (spa_json_parse_int (data, len, va_arg(args, gint *)) < 0)
101 -        return FALSE;
102 -      break;
103 -    case 'f':
104 -      if (spa_json_parse_float (data, len,
105 -          (float *)va_arg(args, double *)) < 0)
106 -        return FALSE;
107 -      break;
108 -    case 's': {
109 -      gchar *str = wp_spa_json_parse_string_internal (data, len);
110 -      if (!str)
111 -        return FALSE;
112 -      *va_arg(args, gchar **) = str;
113 -      break;
114 -    }
115 -    case 'J': {
116 -      WpSpaJson *j = wp_spa_json_new (data, len);
117 -      if (!j)
118 -        return FALSE;
119 -      *va_arg(args, WpSpaJson **) = j;
120 -      break;
121 -    }
122 -    default:
123 -      return FALSE;
124 -  }
125 -  return TRUE;
126 -}
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)                             \
130 +do {                                                                           \
131 +  switch (*fmt) {                                                              \
132 +    case 'n':                                                                  \
133 +      if (!spa_json_is_null (data, len))                                       \
134 +        return FALSE;                                                          \
135 +      break;                                                                   \
136 +    case 'b':                                                                  \
137 +      if (!wp_spa_json_parse_boolean_internal (data, len,                      \
138 +          va_arg(args, gboolean *)))                                           \
139 +        return FALSE;                                                          \
140 +      break;                                                                   \
141 +    case 'i':                                                                  \
142 +      if (spa_json_parse_int (data, len, va_arg(args, gint *)) < 0)            \
143 +        return FALSE;                                                          \
144 +      break;                                                                   \
145 +    case 'f':                                                                  \
146 +      if (spa_json_parse_float (data, len, va_arg(args, float *)) < 0)         \
147 +        return FALSE;                                                          \
148 +      break;                                                                   \
149 +    case 's': {                                                                \
150 +      gchar *str = wp_spa_json_parse_string_internal (data, len);              \
151 +      if (!str)                                                                \
152 +        return FALSE;                                                          \
153 +      *va_arg(args, gchar **) = str;                                           \
154 +      break;                                                                   \
155 +    }                                                                          \
156 +    case 'J': {                                                                \
157 +      WpSpaJson *j = wp_spa_json_new (data, len);                              \
158 +      if (!j)                                                                  \
159 +        return FALSE;                                                          \
160 +      *va_arg(args, WpSpaJson **) = j;                                         \
161 +      break;                                                                   \
162 +    }                                                                          \
163 +    default:                                                                   \
164 +      return FALSE;                                                            \
165 +  }                                                                            \
166 +} while(false)
167  
168  /*!
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);
172  
173      if (g_strcmp0 (key_str, lookup_key) == 0) {
174 -      if (!wp_spa_json_parse_value (value->data, value->size, lookup_fmt, args))
175 -        return FALSE;
176 +      wp_spa_json_parse_value (value->data, value->size, lookup_fmt, args);
177        lookup_key = va_arg(args, const gchar *);
178        if (!lookup_key)
179          return TRUE;
180 @@ -1366,9 +1363,12 @@ gboolean
181  wp_spa_json_parser_get_value (WpSpaJsonParser *self, const gchar *fmt,
182      va_list args)
183  {
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,
189 +        fmt, args);
190 +    return TRUE;
191 +  }
192 +  return FALSE;
193  }
194  
195  /*!
196 @@ -1419,9 +1419,13 @@ wp_spa_json_parser_get_valist (WpSpaJsonParser *self, va_list args)
197      if (!format)
198        return TRUE;
199  
200 -    /* parse value */
201 -    if (!wp_spa_json_parser_get_value (self, format, args))
202 +    /* advance */
203 +    if (!wp_spa_json_parser_advance (self))
204        return FALSE;
205 +
206 +    /* parse value */
207 +    wp_spa_json_parse_value (self->curr.cur, self->curr.end - self->curr.cur,
208 +        format, args);
209    } while (TRUE);
210  
211    return FALSE;
212 -- 
213 2.35.1
214