0001-fix-non-x86_64-architectures.patch 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  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
  5. The va_list type might not always be a pointer in some architectures, so we
  6. cannot guarantee it will be modified after using it for a second time in another
  7. function. This fixes the issue by using macros so args does not get copied, and
  8. always gets modified when using it more than once.
  9. Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com>
  10. Upstream: https://gitlab.freedesktop.org/pipewire/wireplumber/-/commit/e429db7e8c266045aee25e153fb2308bd61fe233
  11. ---
  12. lib/wp/spa-json.c | 156 ++++++++++++++++++++++++----------------------
  13. 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));
  20. }
  21. -static void
  22. -wp_spa_json_builder_add_value (WpSpaJsonBuilder *self, const gchar *fmt,
  23. - va_list args)
  24. -{
  25. - switch (*fmt) {
  26. - case 'n':
  27. - wp_spa_json_builder_add_null (self);
  28. - break;
  29. - case 'b':
  30. - wp_spa_json_builder_add_boolean (self, va_arg(args, gboolean));
  31. - break;
  32. - case 'i':
  33. - wp_spa_json_builder_add_int (self, va_arg(args, gint));
  34. - break;
  35. - case 'f':
  36. - wp_spa_json_builder_add_float (self, (float)va_arg(args, double));
  37. - break;
  38. - case 's':
  39. - wp_spa_json_builder_add_string (self, va_arg(args, const gchar *));
  40. - break;
  41. - case 'J':
  42. - wp_spa_json_builder_add_json (self, va_arg(args, WpSpaJson *));
  43. - break;
  44. - default:
  45. - return;
  46. - }
  47. -}
  48. +/* Args is not a pointer in some architectures, so this needs to be a macro to
  49. + * avoid args being copied */
  50. +#define wp_spa_json_builder_add_value(self,fmt,args) \
  51. +do { \
  52. + switch (*fmt) { \
  53. + case 'n': \
  54. + wp_spa_json_builder_add_null (self); \
  55. + break; \
  56. + case 'b': \
  57. + wp_spa_json_builder_add_boolean (self, va_arg(args, gboolean)); \
  58. + break; \
  59. + case 'i': \
  60. + wp_spa_json_builder_add_int (self, va_arg(args, gint)); \
  61. + break; \
  62. + case 'f': \
  63. + wp_spa_json_builder_add_float (self, (float)va_arg(args, double)); \
  64. + break; \
  65. + case 's': \
  66. + wp_spa_json_builder_add_string (self, va_arg(args, const gchar *)); \
  67. + break; \
  68. + case 'J': \
  69. + wp_spa_json_builder_add_json (self, va_arg(args, WpSpaJson *)); \
  70. + break; \
  71. + default: \
  72. + break; \
  73. + } \
  74. +} while(false)
  75. /*!
  76. * \brief Creates a spa json of type array
  77. @@ -724,48 +724,46 @@ wp_spa_json_parse_object_valist (WpSpaJson *self, va_list args)
  78. return res;
  79. }
  80. -static gboolean
  81. -wp_spa_json_parse_value (const gchar *data, int len, const gchar *fmt,
  82. - va_list args)
  83. -{
  84. - switch (*fmt) {
  85. - case 'n':
  86. - if (!spa_json_is_null (data, len))
  87. - return FALSE;
  88. - break;
  89. - case 'b':
  90. - if (!wp_spa_json_parse_boolean_internal (data, len,
  91. - va_arg(args, gboolean *)))
  92. - return FALSE;
  93. - break;
  94. - case 'i':
  95. - if (spa_json_parse_int (data, len, va_arg(args, gint *)) < 0)
  96. - return FALSE;
  97. - break;
  98. - case 'f':
  99. - if (spa_json_parse_float (data, len,
  100. - (float *)va_arg(args, double *)) < 0)
  101. - return FALSE;
  102. - break;
  103. - case 's': {
  104. - gchar *str = wp_spa_json_parse_string_internal (data, len);
  105. - if (!str)
  106. - return FALSE;
  107. - *va_arg(args, gchar **) = str;
  108. - break;
  109. - }
  110. - case 'J': {
  111. - WpSpaJson *j = wp_spa_json_new (data, len);
  112. - if (!j)
  113. - return FALSE;
  114. - *va_arg(args, WpSpaJson **) = j;
  115. - break;
  116. - }
  117. - default:
  118. - return FALSE;
  119. - }
  120. - return TRUE;
  121. -}
  122. +/* Args is not a pointer in some architectures, so this needs to be a macro to
  123. + * avoid args being copied */
  124. +#define wp_spa_json_parse_value(data,len,fmt,args) \
  125. +do { \
  126. + switch (*fmt) { \
  127. + case 'n': \
  128. + if (!spa_json_is_null (data, len)) \
  129. + return FALSE; \
  130. + break; \
  131. + case 'b': \
  132. + if (!wp_spa_json_parse_boolean_internal (data, len, \
  133. + va_arg(args, gboolean *))) \
  134. + return FALSE; \
  135. + break; \
  136. + case 'i': \
  137. + if (spa_json_parse_int (data, len, va_arg(args, gint *)) < 0) \
  138. + return FALSE; \
  139. + break; \
  140. + case 'f': \
  141. + if (spa_json_parse_float (data, len, va_arg(args, float *)) < 0) \
  142. + return FALSE; \
  143. + break; \
  144. + case 's': { \
  145. + gchar *str = wp_spa_json_parse_string_internal (data, len); \
  146. + if (!str) \
  147. + return FALSE; \
  148. + *va_arg(args, gchar **) = str; \
  149. + break; \
  150. + } \
  151. + case 'J': { \
  152. + WpSpaJson *j = wp_spa_json_new (data, len); \
  153. + if (!j) \
  154. + return FALSE; \
  155. + *va_arg(args, WpSpaJson **) = j; \
  156. + break; \
  157. + } \
  158. + default: \
  159. + return FALSE; \
  160. + } \
  161. +} while(false)
  162. /*!
  163. * \brief Parses the object property values of a spa json object
  164. @@ -827,8 +825,7 @@ wp_spa_json_object_get_valist (WpSpaJson *self, va_list args)
  165. value = g_value_get_boxed (&item);
  166. if (g_strcmp0 (key_str, lookup_key) == 0) {
  167. - if (!wp_spa_json_parse_value (value->data, value->size, lookup_fmt, args))
  168. - return FALSE;
  169. + wp_spa_json_parse_value (value->data, value->size, lookup_fmt, args);
  170. lookup_key = va_arg(args, const gchar *);
  171. if (!lookup_key)
  172. return TRUE;
  173. @@ -1366,9 +1363,12 @@ gboolean
  174. wp_spa_json_parser_get_value (WpSpaJsonParser *self, const gchar *fmt,
  175. va_list args)
  176. {
  177. - return wp_spa_json_parser_advance (self) &&
  178. - wp_spa_json_parse_value (self->curr.cur,
  179. - self->curr.end - self->curr.cur, fmt, args);
  180. + if (wp_spa_json_parser_advance (self)) {
  181. + wp_spa_json_parse_value (self->curr.cur, self->curr.end - self->curr.cur,
  182. + fmt, args);
  183. + return TRUE;
  184. + }
  185. + return FALSE;
  186. }
  187. /*!
  188. @@ -1419,9 +1419,13 @@ wp_spa_json_parser_get_valist (WpSpaJsonParser *self, va_list args)
  189. if (!format)
  190. return TRUE;
  191. - /* parse value */
  192. - if (!wp_spa_json_parser_get_value (self, format, args))
  193. + /* advance */
  194. + if (!wp_spa_json_parser_advance (self))
  195. return FALSE;
  196. +
  197. + /* parse value */
  198. + wp_spa_json_parse_value (self->curr.cur, self->curr.end - self->curr.cur,
  199. + format, args);
  200. } while (TRUE);
  201. return FALSE;
  202. --
  203. GitLab