makiri 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/conformance.yml +22 -0
  3. data/.github/workflows/libfuzzer.yml +83 -0
  4. data/.github/workflows/release.yml +12 -7
  5. data/.github/workflows/security.yml +88 -3
  6. data/.github/workflows/valgrind.yml +135 -0
  7. data/CHANGELOG.md +152 -15
  8. data/README.md +183 -13
  9. data/Rakefile +294 -7
  10. data/ext/makiri/bridge/bridge.h +28 -0
  11. data/ext/makiri/bridge/ruby_string.c +282 -12
  12. data/ext/makiri/core/mkr_alloc.c +40 -3
  13. data/ext/makiri/core/mkr_alloc.h +28 -5
  14. data/ext/makiri/core/mkr_buf.c +47 -3
  15. data/ext/makiri/core/mkr_buf.h +112 -3
  16. data/ext/makiri/core/mkr_core.c +143 -0
  17. data/ext/makiri/core/mkr_core.h +11 -2
  18. data/ext/makiri/core/mkr_hash.h +1 -1
  19. data/ext/makiri/core/mkr_span.h +186 -0
  20. data/ext/makiri/core/mkr_text.h +8 -8
  21. data/ext/makiri/core/mkr_utf8.c +101 -0
  22. data/ext/makiri/core/mkr_utf8.h +88 -0
  23. data/ext/makiri/extconf.rb +123 -10
  24. data/ext/makiri/fuzz/Makefile +95 -0
  25. data/ext/makiri/fuzz/check_fuzzer.cc +4 -0
  26. data/ext/makiri/fuzz/xml_fuzz.c +24 -0
  27. data/ext/makiri/fuzz/xpath_fuzz.c +109 -0
  28. data/ext/makiri/glue/glue.h +55 -11
  29. data/ext/makiri/glue/ruby_doc.c +129 -59
  30. data/ext/makiri/glue/ruby_html_css.c +292 -0
  31. data/ext/makiri/glue/{ruby_mutate.c → ruby_html_mutate.c} +248 -52
  32. data/ext/makiri/glue/ruby_html_node.c +859 -0
  33. data/ext/makiri/glue/ruby_html_serialize.c +154 -0
  34. data/ext/makiri/glue/ruby_node.c +74 -729
  35. data/ext/makiri/glue/ruby_node_set.c +167 -32
  36. data/ext/makiri/glue/ruby_xml.c +602 -0
  37. data/ext/makiri/glue/ruby_xml_node.c +1373 -0
  38. data/ext/makiri/glue/ruby_xpath.c +63 -30
  39. data/ext/makiri/glue/ruby_xpath.h +19 -0
  40. data/ext/makiri/lexbor_compat/compat.h +42 -9
  41. data/ext/makiri/lexbor_compat/compat_internal.h +1 -1
  42. data/ext/makiri/lexbor_compat/dom_index.c +2 -2
  43. data/ext/makiri/lexbor_compat/post_parse.c +100 -10
  44. data/ext/makiri/lexbor_compat/source_loc.c +15 -13
  45. data/ext/makiri/lexbor_compat/text_index.c +14 -8
  46. data/ext/makiri/lexbor_compat/utf8_input.c +19 -33
  47. data/ext/makiri/makiri.c +184 -6
  48. data/ext/makiri/makiri.h +43 -2
  49. data/ext/makiri/xml/mkr_xml.h +125 -0
  50. data/ext/makiri/xml/mkr_xml_chars.c +195 -0
  51. data/ext/makiri/xml/mkr_xml_index.c +169 -0
  52. data/ext/makiri/xml/mkr_xml_index.h +48 -0
  53. data/ext/makiri/xml/mkr_xml_mutate.c +817 -0
  54. data/ext/makiri/xml/mkr_xml_mutate.h +139 -0
  55. data/ext/makiri/xml/mkr_xml_node.c +399 -0
  56. data/ext/makiri/xml/mkr_xml_node.h +184 -0
  57. data/ext/makiri/xml/mkr_xml_tree.c +1515 -0
  58. data/ext/makiri/xpath/mkr_css.c +1023 -0
  59. data/ext/makiri/xpath/mkr_css.h +65 -0
  60. data/ext/makiri/xpath/mkr_xpath.c +96 -32
  61. data/ext/makiri/xpath/mkr_xpath.h +109 -4
  62. data/ext/makiri/xpath/mkr_xpath_engine_html.c +17 -0
  63. data/ext/makiri/xpath/mkr_xpath_engine_xml.c +12 -0
  64. data/ext/makiri/xpath/{mkr_xpath_eval.c → mkr_xpath_eval_body.h} +551 -241
  65. data/ext/makiri/xpath/{mkr_xpath_funcs.c → mkr_xpath_funcs_body.h} +318 -276
  66. data/ext/makiri/xpath/mkr_xpath_internal.h +177 -206
  67. data/ext/makiri/xpath/mkr_xpath_lex.c +95 -125
  68. data/ext/makiri/xpath/mkr_xpath_node_access_html.h +138 -0
  69. data/ext/makiri/xpath/mkr_xpath_node_access_xml.h +145 -0
  70. data/ext/makiri/xpath/mkr_xpath_number.c +109 -0
  71. data/ext/makiri/xpath/mkr_xpath_parse.c +83 -94
  72. data/ext/makiri/xpath/mkr_xpath_prelude_html.h +30 -0
  73. data/ext/makiri/xpath/mkr_xpath_prelude_xml.h +28 -0
  74. data/ext/makiri/xpath/mkr_xpath_shared.c +609 -0
  75. data/ext/makiri/xpath/mkr_xpath_value_body.h +801 -0
  76. data/ext/makiri/xpath/mkr_xpath_xml_selftest.c +76 -0
  77. data/lib/makiri/{attribute.rb → attr.rb} +7 -3
  78. data/lib/makiri/cdata_section.rb +19 -0
  79. data/lib/makiri/comment.rb +10 -0
  80. data/lib/makiri/compat_aliases.rb +30 -0
  81. data/lib/makiri/document.rb +9 -73
  82. data/lib/makiri/document_fragment.rb +14 -9
  83. data/lib/makiri/element.rb +4 -4
  84. data/lib/makiri/html/document.rb +106 -0
  85. data/lib/makiri/html/node_methods.rb +19 -0
  86. data/lib/makiri/html.rb +12 -0
  87. data/lib/makiri/node.rb +58 -15
  88. data/lib/makiri/node_set.rb +8 -0
  89. data/lib/makiri/processing_instruction.rb +10 -0
  90. data/lib/makiri/text.rb +1 -1
  91. data/lib/makiri/version.rb +1 -1
  92. data/lib/makiri/xml/builder.rb +263 -0
  93. data/lib/makiri/xml/document.rb +24 -0
  94. data/lib/makiri/xml/node_methods.rb +84 -0
  95. data/lib/makiri/xml.rb +10 -0
  96. data/lib/makiri/xpath_context.rb +1 -1
  97. data/lib/makiri.rb +24 -5
  98. data/script/build_native_gem.rb +2 -2
  99. data/script/check_alloc_failures.rb +266 -0
  100. data/script/check_c_safety.rb +77 -2
  101. data/script/check_c_safety_allowlist.yml +102 -0
  102. data/script/check_leaks.rb +64 -0
  103. data/script/leaks_harness.rb +64 -0
  104. data/vendor/lexbor/CMakeLists.txt +6 -0
  105. data/vendor/lexbor/README.md +12 -0
  106. data/vendor/lexbor/config.cmake +1 -1
  107. data/vendor/lexbor/source/lexbor/core/base.h +1 -1
  108. data/vendor/lexbor/source/lexbor/core/config.cmake +9 -1
  109. data/vendor/lexbor/source/lexbor/css/selectors/pseudo_state.c +2 -3
  110. data/vendor/lexbor/source/lexbor/css/selectors/state.c +3 -0
  111. data/vendor/lexbor/source/lexbor/dom/interfaces/element.c +21 -0
  112. data/vendor/lexbor/source/lexbor/dom/interfaces/element.h +5 -0
  113. data/vendor/lexbor/source/lexbor/encoding/decode.c +33 -4
  114. data/vendor/lexbor/source/lexbor/html/base.h +1 -1
  115. data/vendor/lexbor/source/lexbor/html/interfaces/select_element.c +4 -0
  116. data/vendor/lexbor/source/lexbor/html/serialize.c +545 -41
  117. data/vendor/lexbor/source/lexbor/html/serialize.h +2 -1
  118. data/vendor/lexbor/source/lexbor/html/tokenizer.h +2 -2
  119. data/vendor/lexbor/source/lexbor/html/tree/insertion_mode/in_body.c +1 -1
  120. data/vendor/lexbor/source/lexbor/html/tree.c +6 -6
  121. data/vendor/lexbor/source/lexbor/selectors/selectors.c +12 -3
  122. data/vendor/lexbor/source/lexbor/url/base.h +1 -1
  123. data/vendor/lexbor/source/lexbor/url/url.c +5 -2
  124. data/vendor/lexbor/source/lexbor/url/url.h +9 -0
  125. data/vendor/lexbor/version +1 -1
  126. metadata +53 -9
  127. data/ext/makiri/glue/ruby_css.c +0 -185
  128. data/ext/makiri/glue/ruby_serialize.c +0 -92
  129. data/ext/makiri/xpath/mkr_xpath_value.c +0 -1286
  130. data/lib/makiri/cdata.rb +0 -6
@@ -27,7 +27,7 @@ extern "C" {
27
27
  #include "lexbor/core/lexbor.h"
28
28
 
29
29
  #define LEXBOR_VERSION_MAJOR 3
30
- #define LEXBOR_VERSION_MINOR 0
30
+ #define LEXBOR_VERSION_MINOR 1
31
31
  #define LEXBOR_VERSION_PATCH 0
32
32
 
33
33
  #define LEXBOR_VERSION_STRING LEXBOR_STRINGIZE(LEXBOR_VERSION_MAJOR) "." \
@@ -3,10 +3,18 @@ set(DESCRIPTION "The main module of the Lexbor project.
3
3
  The module includes various algorithms and methods for working with memory:
4
4
  AVL Tree, Array, String, Memory Pool and so on.")
5
5
 
6
- IF(LEXBOR_BUILD_SEPARATELY)
6
+ IF(TARGET ${CURRENT_LIB_NAME})
7
7
  FEATURE_TRY_FUNCTION_EXISTS("${CURRENT_LIB_NAME}" "ceil" "m")
8
8
  ENDIF()
9
9
 
10
+ IF(TARGET ${CURRENT_LIB_NAME_STATIC})
11
+ FEATURE_TRY_FUNCTION_EXISTS("${CURRENT_LIB_NAME_STATIC}" "ceil" "m")
12
+ ENDIF()
13
+
10
14
  IF(TARGET ${LEXBOR_LIB_NAME})
11
15
  FEATURE_TRY_FUNCTION_EXISTS("${LEXBOR_LIB_NAME}" "ceil" "m")
16
+ ENDIF()
17
+
18
+ IF(TARGET ${LEXBOR_LIB_NAME_STATIC})
19
+ FEATURE_TRY_FUNCTION_EXISTS("${LEXBOR_LIB_NAME_STATIC}" "ceil" "m")
12
20
  ENDIF()
@@ -227,13 +227,12 @@ again:
227
227
  contains->insensitive = false;
228
228
  str = &contains->str;
229
229
 
230
- str->data = lexbor_mraw_alloc(parser->memory->mraw,
231
- sizeof(lexbor_str_t));
230
+ str->data = lexbor_mraw_alloc(parser->memory->mraw, length + 1);
232
231
  if (str->data == NULL) {
233
232
  return lxb_css_parser_memory_fail(parser);
234
233
  }
235
234
 
236
- memcpy(str->data, data, length + 1);
235
+ memcpy(str->data, data, length);
237
236
 
238
237
  str->length = length;
239
238
  str->data[length] = '\0';
@@ -1138,6 +1138,9 @@ lxb_css_selectors_state_element_ns(lxb_css_parser_t *parser,
1138
1138
  return lxb_css_selectors_state_ns(parser, selector);
1139
1139
  }
1140
1140
 
1141
+ selector->name.data[0] = '\0';
1142
+ selector->name.length = 0;
1143
+
1141
1144
  lxb_css_syntax_parser_consume(parser);
1142
1145
 
1143
1146
  return lxb_css_selectors_state_ns_ident(parser, selector);
@@ -474,6 +474,27 @@ lxb_dom_element_attr_by_local_name_data(lxb_dom_element_t *element,
474
474
  return NULL;
475
475
  }
476
476
 
477
+ lxb_dom_attr_t *
478
+ lxb_dom_element_attr_by_local_name_ns_data(lxb_dom_element_t *element,
479
+ const lxb_dom_attr_data_t *data,
480
+ lxb_ns_id_t ns)
481
+ {
482
+ lxb_dom_attr_t *attr = element->first_attr;
483
+
484
+ while (attr != NULL) {
485
+ if ((attr->node.local_name == data->attr_id
486
+ && attr->node.ns == ns)
487
+ || attr->qualified_name == data->attr_id)
488
+ {
489
+ return attr;
490
+ }
491
+
492
+ attr = attr->next;
493
+ }
494
+
495
+ return NULL;
496
+ }
497
+
477
498
  lxb_dom_attr_t *
478
499
  lxb_dom_element_attr_by_id(lxb_dom_element_t *element,
479
500
  lxb_dom_attr_id_t attr_id)
@@ -140,6 +140,11 @@ LXB_API lxb_dom_attr_t *
140
140
  lxb_dom_element_attr_by_local_name_data(lxb_dom_element_t *element,
141
141
  const lxb_dom_attr_data_t *data);
142
142
 
143
+ LXB_API lxb_dom_attr_t *
144
+ lxb_dom_element_attr_by_local_name_ns_data(lxb_dom_element_t *element,
145
+ const lxb_dom_attr_data_t *data,
146
+ lxb_ns_id_t ns);
147
+
143
148
  LXB_API lxb_dom_attr_t *
144
149
  lxb_dom_element_attr_by_id(lxb_dom_element_t *element,
145
150
  lxb_dom_attr_id_t attr_id);
@@ -912,6 +912,13 @@ lxb_encoding_decode_iso_2022_jp(lxb_encoding_decode_t *ctx,
912
912
  }
913
913
  LXB_ENCODING_DECODE_ERROR_END();
914
914
 
915
+ if (ctx->buffer_used >= ctx->buffer_length) {
916
+ iso->prepand = iso->lead;
917
+ iso->lead = 0x00;
918
+
919
+ return LXB_STATUS_SMALL_BUFFER;
920
+ }
921
+
915
922
  byte = iso->lead;
916
923
  iso->lead = 0x00;
917
924
 
@@ -1279,6 +1286,12 @@ lxb_encoding_decode_utf_16(lxb_encoding_decode_t *ctx, bool is_be,
1279
1286
  }
1280
1287
  LXB_ENCODING_DECODE_ERROR_END();
1281
1288
 
1289
+ if (ctx->buffer_used >= ctx->buffer_length) {
1290
+ ctx->u.lead = lead + 0x01;
1291
+
1292
+ return LXB_STATUS_SMALL_BUFFER;
1293
+ }
1294
+
1282
1295
  goto lead_state;
1283
1296
  }
1284
1297
 
@@ -1723,6 +1736,13 @@ lxb_encoding_decode_gb18030(lxb_encoding_decode_t *ctx,
1723
1736
  }
1724
1737
  LXB_ENCODING_DECODE_ERROR_END();
1725
1738
 
1739
+ if (ctx->buffer_used >= ctx->buffer_length) {
1740
+ ctx->prepend = true;
1741
+ ctx->u.gb18030.first = second;
1742
+
1743
+ return LXB_STATUS_SMALL_BUFFER;
1744
+ }
1745
+
1726
1746
  first = second;
1727
1747
 
1728
1748
  goto prepend_first;
@@ -1756,11 +1776,8 @@ lxb_encoding_decode_gb18030(lxb_encoding_decode_t *ctx,
1756
1776
  }
1757
1777
  LXB_ENCODING_DECODE_ERROR_END();
1758
1778
 
1759
- LXB_ENCODING_DECODE_APPEND_WO_CHECK(ctx, second);
1760
-
1761
- if (ctx->buffer_used == ctx->buffer_length) {
1779
+ if (ctx->buffer_used >= ctx->buffer_length) {
1762
1780
  ctx->prepend = true;
1763
- ctx->have_error = true;
1764
1781
 
1765
1782
  /* First is a fake for trigger */
1766
1783
  ctx->u.gb18030.first = 0x01;
@@ -1770,6 +1787,18 @@ lxb_encoding_decode_gb18030(lxb_encoding_decode_t *ctx,
1770
1787
  return LXB_STATUS_SMALL_BUFFER;
1771
1788
  }
1772
1789
 
1790
+ LXB_ENCODING_DECODE_APPEND_WO_CHECK(ctx, second);
1791
+
1792
+ if (ctx->buffer_used >= ctx->buffer_length) {
1793
+ ctx->prepend = true;
1794
+
1795
+ ctx->u.gb18030.first = third;
1796
+ ctx->u.gb18030.second = 0x00;
1797
+ ctx->u.gb18030.third = 0x00;
1798
+
1799
+ return LXB_STATUS_SMALL_BUFFER;
1800
+ }
1801
+
1773
1802
  first = third;
1774
1803
 
1775
1804
  goto prepend_first;
@@ -15,7 +15,7 @@ extern "C" {
15
15
 
16
16
 
17
17
  #define LXB_HTML_VERSION_MAJOR 2
18
- #define LXB_HTML_VERSION_MINOR 9
18
+ #define LXB_HTML_VERSION_MINOR 10
19
19
  #define LXB_HTML_VERSION_PATCH 0
20
20
 
21
21
  #define LXB_HTML_VERSION_STRING LEXBOR_STRINGIZE(LXB_HTML_VERSION_MAJOR) "." \
@@ -72,6 +72,10 @@ lxb_html_select_selectedness_display_size(lxb_html_select_element_t *el)
72
72
 
73
73
  value = size->value;
74
74
 
75
+ if (value == NULL) {
76
+ goto default_size;
77
+ }
78
+
75
79
  status = lxb_html_common_parsing_nonneg_integer(value->data, value->length,
76
80
  &len);
77
81
  if (status != LXB_STATUS_OK || len < 0) {