libxkbcommon-0.8.0_fix_malloc.patch 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. diff -Nru libxkbcommon-0.8.0.orig/src/xkbcomp/ast-build.c libxkbcommon-0.8.0/src/xkbcomp/ast-build.c
  2. --- libxkbcommon-0.8.0.orig/src/xkbcomp/ast-build.c 2017-12-12 13:40:28.000000000 +0100
  3. +++ libxkbcommon-0.8.0/src/xkbcomp/ast-build.c 2025-06-06 15:35:33.571894817 +0200
  4. @@ -72,7 +72,7 @@
  5. static ExprDef *
  6. ExprCreate(enum expr_op_type op, enum expr_value_type type, size_t size)
  7. {
  8. - ExprDef *expr = malloc(size);
  9. + ExprDef *expr = malloc(sizeof(ExprDef));
  10. if (!expr)
  11. return NULL;
  12. @@ -84,15 +84,12 @@
  13. return expr;
  14. }
  15. -#define EXPR_CREATE(type_, name_, op_, value_type_) \
  16. - ExprDef *name_ = ExprCreate(op_, value_type_, sizeof(type_)); \
  17. - if (!name_) \
  18. - return NULL;
  19. -
  20. ExprDef *
  21. ExprCreateString(xkb_atom_t str)
  22. {
  23. - EXPR_CREATE(ExprString, expr, EXPR_VALUE, EXPR_TYPE_STRING);
  24. + ExprDef *expr = ExprCreate(EXPR_VALUE, EXPR_TYPE_STRING, sizeof(ExprString));
  25. + if (!expr)
  26. + return NULL;
  27. expr->string.str = str;
  28. return expr;
  29. }
  30. @@ -100,7 +97,9 @@
  31. ExprDef *
  32. ExprCreateInteger(int ival)
  33. {
  34. - EXPR_CREATE(ExprInteger, expr, EXPR_VALUE, EXPR_TYPE_INT);
  35. + ExprDef *expr = ExprCreate(EXPR_VALUE, EXPR_TYPE_INT, sizeof(ExprInteger));
  36. + if (!expr)
  37. + return NULL;
  38. expr->integer.ival = ival;
  39. return expr;
  40. }
  41. @@ -108,7 +107,9 @@
  42. ExprDef *
  43. ExprCreateBoolean(bool set)
  44. {
  45. - EXPR_CREATE(ExprBoolean, expr, EXPR_VALUE, EXPR_TYPE_BOOLEAN);
  46. + ExprDef *expr = ExprCreate(EXPR_VALUE, EXPR_TYPE_BOOLEAN, sizeof(ExprBoolean));
  47. + if (!expr)
  48. + return NULL;
  49. expr->boolean.set = set;
  50. return expr;
  51. }
  52. @@ -116,7 +117,9 @@
  53. ExprDef *
  54. ExprCreateKeyName(xkb_atom_t key_name)
  55. {
  56. - EXPR_CREATE(ExprKeyName, expr, EXPR_VALUE, EXPR_TYPE_KEYNAME);
  57. + ExprDef *expr = ExprCreate(EXPR_VALUE, EXPR_TYPE_KEYNAME, sizeof(ExprKeyName));
  58. + if (!expr)
  59. + return NULL;
  60. expr->key_name.key_name = key_name;
  61. return expr;
  62. }
  63. @@ -124,7 +127,9 @@
  64. ExprDef *
  65. ExprCreateIdent(xkb_atom_t ident)
  66. {
  67. - EXPR_CREATE(ExprIdent, expr, EXPR_IDENT, EXPR_TYPE_UNKNOWN);
  68. + ExprDef *expr = ExprCreate(EXPR_IDENT, EXPR_TYPE_UNKNOWN, sizeof(ExprIdent));
  69. + if (!expr)
  70. + return NULL;
  71. expr->ident.ident = ident;
  72. return expr;
  73. }
  74. @@ -133,7 +138,9 @@
  75. ExprCreateUnary(enum expr_op_type op, enum expr_value_type type,
  76. ExprDef *child)
  77. {
  78. - EXPR_CREATE(ExprUnary, expr, op, type);
  79. + ExprDef *expr = ExprCreate(op, type, sizeof(ExprUnary));
  80. + if (!expr)
  81. + return NULL;
  82. expr->unary.child = child;
  83. return expr;
  84. }
  85. @@ -141,7 +148,9 @@
  86. ExprDef *
  87. ExprCreateBinary(enum expr_op_type op, ExprDef *left, ExprDef *right)
  88. {
  89. - EXPR_CREATE(ExprBinary, expr, op, EXPR_TYPE_UNKNOWN);
  90. + ExprDef *expr = ExprCreate(op, EXPR_TYPE_UNKNOWN, sizeof(ExprBinary));
  91. + if (!expr)
  92. + return NULL;
  93. if (op == EXPR_ASSIGN || left->expr.value_type == EXPR_TYPE_UNKNOWN)
  94. expr->expr.value_type = right->expr.value_type;
  95. @@ -157,7 +166,9 @@
  96. ExprDef *
  97. ExprCreateFieldRef(xkb_atom_t element, xkb_atom_t field)
  98. {
  99. - EXPR_CREATE(ExprFieldRef, expr, EXPR_FIELD_REF, EXPR_TYPE_UNKNOWN);
  100. + ExprDef *expr = ExprCreate(EXPR_FIELD_REF, EXPR_TYPE_UNKNOWN, sizeof(ExprFieldRef));
  101. + if (!expr)
  102. + return NULL;
  103. expr->field_ref.element = element;
  104. expr->field_ref.field = field;
  105. return expr;
  106. @@ -166,7 +177,9 @@
  107. ExprDef *
  108. ExprCreateArrayRef(xkb_atom_t element, xkb_atom_t field, ExprDef *entry)
  109. {
  110. - EXPR_CREATE(ExprArrayRef, expr, EXPR_ARRAY_REF, EXPR_TYPE_UNKNOWN);
  111. + ExprDef *expr = ExprCreate(EXPR_ARRAY_REF, EXPR_TYPE_UNKNOWN, sizeof(ExprArrayRef));
  112. + if (!expr)
  113. + return NULL;
  114. expr->array_ref.element = element;
  115. expr->array_ref.field = field;
  116. expr->array_ref.entry = entry;
  117. @@ -176,7 +189,9 @@
  118. ExprDef *
  119. ExprCreateAction(xkb_atom_t name, ExprDef *args)
  120. {
  121. - EXPR_CREATE(ExprAction, expr, EXPR_ACTION_DECL, EXPR_TYPE_UNKNOWN);
  122. + ExprDef *expr = ExprCreate(EXPR_ACTION_DECL, EXPR_TYPE_UNKNOWN, sizeof(ExprAction));
  123. + if (!expr)
  124. + return NULL;
  125. expr->action.name = name;
  126. expr->action.args = args;
  127. return expr;
  128. @@ -185,7 +200,9 @@
  129. ExprDef *
  130. ExprCreateKeysymList(xkb_keysym_t sym)
  131. {
  132. - EXPR_CREATE(ExprKeysymList, expr, EXPR_KEYSYM_LIST, EXPR_TYPE_SYMBOLS);
  133. + ExprDef *expr = ExprCreate(EXPR_KEYSYM_LIST, EXPR_TYPE_SYMBOLS, sizeof(ExprKeysymList));
  134. + if (!expr)
  135. + return NULL;
  136. darray_init(expr->keysym_list.syms);
  137. darray_init(expr->keysym_list.symsMapIndex);
  138. @@ -233,7 +250,7 @@
  139. darray_append(expr->keysym_list.symsNumEntries, numEntries);
  140. darray_concat(expr->keysym_list.syms, append->keysym_list.syms);
  141. - FreeStmt((ParseCommon *) &append);
  142. + FreeStmt((ParseCommon *) append);
  143. return expr;
  144. }
  145. @@ -438,15 +455,16 @@
  146. IncludeCreate(struct xkb_context *ctx, char *str, enum merge_mode merge)
  147. {
  148. IncludeStmt *incl, *first;
  149. - char *file, *map, *stmt, *tmp, *extra_data;
  150. + char *stmt, *tmp;
  151. char nextop;
  152. incl = first = NULL;
  153. - file = map = NULL;
  154. tmp = str;
  155. stmt = strdup_safe(str);
  156. while (tmp && *tmp)
  157. {
  158. + char *file = NULL, *map = NULL, *extra_data = NULL;
  159. +
  160. if (!ParseIncludeMap(&tmp, &file, &map, &nextop, &extra_data))
  161. goto err;
  162. @@ -470,8 +488,12 @@
  163. incl = incl->next_incl;
  164. }
  165. - if (!incl)
  166. + if (!incl) {
  167. + free(file);
  168. + free(map);
  169. + free(extra_data);
  170. break;
  171. + }
  172. incl->common.type = STMT_INCLUDE;
  173. incl->common.next = NULL;
  174. @@ -532,7 +554,7 @@
  175. enum xkb_file_type type;
  176. IncludeStmt *include = NULL;
  177. XkbFile *file = NULL;
  178. - ParseCommon *defs = NULL;
  179. + ParseCommon *defs = NULL, *defsLast = NULL;
  180. for (type = FIRST_KEYMAP_FILE_TYPE; type <= LAST_KEYMAP_FILE_TYPE; type++) {
  181. include = IncludeCreate(ctx, components[type], MERGE_DEFAULT);
  182. @@ -545,7 +567,10 @@
  183. goto err;
  184. }
  185. - defs = AppendStmt(defs, &file->common);
  186. + if (!defs)
  187. + defsLast = defs = &file->common;
  188. + else
  189. + defsLast = defsLast->next = &file->common;
  190. }
  191. file = XkbFileCreate(FILE_TYPE_KEYMAP, NULL, defs, 0);
  192. @@ -722,7 +747,7 @@
  193. const char *
  194. xkb_file_type_to_string(enum xkb_file_type type)
  195. {
  196. - if (type > _FILE_TYPE_NUM_ENTRIES)
  197. + if (type >= _FILE_TYPE_NUM_ENTRIES)
  198. return "unknown";
  199. return xkb_file_type_strings[type];
  200. }