grpc 1.41.0 → 1.42.0.pre1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (519) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +57 -44
  3. data/etc/roots.pem +335 -326
  4. data/include/grpc/event_engine/event_engine.h +82 -42
  5. data/include/grpc/event_engine/internal/memory_allocator_impl.h +98 -0
  6. data/include/grpc/event_engine/memory_allocator.h +210 -0
  7. data/include/grpc/grpc.h +4 -0
  8. data/include/grpc/grpc_security.h +18 -0
  9. data/include/grpc/grpc_security_constants.h +1 -0
  10. data/include/grpc/impl/codegen/port_platform.h +7 -0
  11. data/src/core/ext/filters/client_channel/backend_metric.cc +18 -19
  12. data/src/core/ext/filters/client_channel/backup_poller.cc +2 -1
  13. data/src/core/ext/filters/client_channel/channel_connectivity.cc +71 -89
  14. data/src/core/ext/filters/client_channel/client_channel.cc +187 -252
  15. data/src/core/ext/filters/client_channel/client_channel.h +74 -27
  16. data/src/core/ext/filters/client_channel/client_channel_factory.cc +1 -1
  17. data/src/core/ext/filters/client_channel/client_channel_factory.h +17 -19
  18. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +8 -14
  19. data/src/core/ext/filters/client_channel/config_selector.cc +1 -1
  20. data/src/core/ext/filters/client_channel/config_selector.h +4 -5
  21. data/src/core/ext/filters/client_channel/connector.h +18 -18
  22. data/src/core/ext/filters/client_channel/dynamic_filters.cc +1 -1
  23. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +0 -1
  24. data/src/core/ext/filters/client_channel/health/health_check_client.cc +12 -11
  25. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
  26. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +4 -0
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -15
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +166 -82
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +4 -0
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +2 -4
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +23 -7
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -10
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -3
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +2502 -0
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +6 -1
  37. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +7 -1
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +6 -2
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +1 -1
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -0
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -1
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +7 -16
  43. data/src/core/ext/filters/client_channel/lb_policy.h +11 -1
  44. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -0
  45. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +139 -0
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +11 -5
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +3 -3
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +12 -39
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +21 -1
  50. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +6 -2
  51. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +3 -1
  52. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +77 -68
  53. data/src/core/ext/filters/client_channel/resolver.h +1 -1
  54. data/src/core/ext/filters/client_channel/resolver_factory.h +2 -0
  55. data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -8
  56. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
  57. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +1 -1
  58. data/src/core/ext/filters/client_channel/retry_filter.cc +48 -86
  59. data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
  60. data/src/core/ext/filters/client_channel/retry_throttle.cc +17 -48
  61. data/src/core/ext/filters/client_channel/server_address.h +1 -1
  62. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +49 -36
  63. data/src/core/ext/filters/client_channel/subchannel.cc +85 -143
  64. data/src/core/ext/filters/client_channel/subchannel.h +29 -49
  65. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +22 -7
  66. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +11 -2
  67. data/src/core/ext/filters/client_idle/client_idle_filter.cc +27 -210
  68. data/src/core/ext/filters/client_idle/idle_filter_state.cc +96 -0
  69. data/src/core/ext/filters/client_idle/idle_filter_state.h +66 -0
  70. data/src/core/ext/filters/deadline/deadline_filter.cc +23 -26
  71. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +19 -19
  72. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -1
  73. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  74. data/src/core/ext/filters/http/client/http_client_filter.cc +41 -44
  75. data/src/core/ext/filters/http/client_authority_filter.cc +14 -15
  76. data/src/core/ext/filters/http/http_filters_plugin.cc +53 -71
  77. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +17 -12
  78. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +1 -1
  79. data/src/core/ext/filters/http/server/http_server_filter.cc +72 -69
  80. data/src/core/ext/filters/max_age/max_age_filter.cc +24 -26
  81. data/src/core/ext/filters/message_size/message_size_filter.cc +19 -16
  82. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  83. data/src/core/ext/{filters/client_channel → service_config}/service_config.cc +2 -2
  84. data/src/core/ext/{filters/client_channel → service_config}/service_config.h +4 -4
  85. data/src/core/ext/service_config/service_config_call_data.h +72 -0
  86. data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.cc +3 -3
  87. data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.h +8 -6
  88. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -5
  89. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +19 -24
  90. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +27 -50
  91. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +14 -16
  92. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +59 -58
  93. data/src/core/ext/transport/chttp2/transport/flow_control.cc +19 -16
  94. data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -4
  95. data/src/core/ext/transport/chttp2/transport/frame_data.cc +4 -4
  96. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
  97. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -1
  98. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -3
  99. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -2
  100. data/src/core/ext/transport/chttp2/transport/hpack_constants.h +1 -1
  101. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +41 -1
  102. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -4
  103. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +1 -1
  104. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +136 -98
  105. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +27 -8
  106. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +12 -25
  107. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +37 -30
  108. data/src/core/ext/transport/chttp2/transport/internal.h +4 -3
  109. data/src/core/ext/transport/chttp2/transport/parsing.cc +30 -173
  110. data/src/core/ext/transport/chttp2/transport/popularity_count.h +1 -1
  111. data/src/core/ext/transport/chttp2/transport/writing.cc +29 -22
  112. data/src/core/ext/transport/inproc/inproc_transport.cc +105 -109
  113. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +68 -34
  114. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +139 -1
  115. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +16 -4
  116. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +53 -4
  117. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +3 -2
  118. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +15 -0
  119. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +13 -8
  120. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +23 -0
  121. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +0 -1
  122. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +14 -11
  123. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +17 -0
  124. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +15 -12
  125. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +49 -19
  126. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +55 -0
  127. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +154 -0
  128. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +0 -2
  129. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +58 -0
  130. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +182 -0
  131. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +1 -1
  132. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +1 -1
  133. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +1 -1
  134. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +1 -1
  135. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +1 -1
  136. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +1 -1
  137. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +58 -0
  138. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +130 -0
  139. data/src/core/ext/upb-generated/{udpa/type/v1 → xds/type/v3}/typed_struct.upb.c +7 -7
  140. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +83 -0
  141. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +310 -286
  142. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +10 -0
  143. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +101 -88
  144. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +5 -0
  145. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +59 -56
  146. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +59 -46
  147. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +78 -82
  148. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +323 -316
  149. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +5 -4
  150. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +19 -23
  151. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +4 -3
  152. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +5 -3
  153. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +5 -4
  154. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +75 -0
  155. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.h +50 -0
  156. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +13 -12
  157. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +25 -24
  158. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +16 -15
  159. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +17 -16
  160. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +33 -32
  161. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +19 -18
  162. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +45 -0
  163. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.h +35 -0
  164. data/src/core/ext/xds/xds_api.cc +325 -362
  165. data/src/core/ext/xds/xds_api.h +134 -82
  166. data/src/core/ext/xds/xds_bootstrap.h +10 -0
  167. data/src/core/ext/xds/xds_certificate_provider.cc +3 -3
  168. data/src/core/ext/xds/xds_channel_stack_modifier.cc +113 -0
  169. data/src/core/ext/xds/xds_channel_stack_modifier.h +52 -0
  170. data/src/core/ext/xds/xds_client.cc +527 -314
  171. data/src/core/ext/xds/xds_client.h +42 -37
  172. data/src/core/ext/xds/xds_client_stats.h +1 -1
  173. data/src/core/ext/xds/xds_server_config_fetcher.cc +5 -7
  174. data/src/core/lib/address_utils/parse_address.cc +2 -0
  175. data/src/core/lib/avl/avl.cc +5 -5
  176. data/src/core/lib/backoff/backoff.cc +1 -1
  177. data/src/core/lib/channel/channel_args.cc +24 -6
  178. data/src/core/lib/channel/channel_args.h +9 -0
  179. data/src/core/lib/channel/channel_stack_builder.cc +3 -3
  180. data/src/core/lib/channel/channel_trace.cc +1 -1
  181. data/src/core/lib/channel/channel_trace.h +1 -1
  182. data/src/core/lib/channel/channelz.cc +3 -3
  183. data/src/core/lib/channel/channelz.h +2 -2
  184. data/src/core/lib/channel/channelz_registry.cc +1 -1
  185. data/src/core/lib/channel/channelz_registry.h +1 -1
  186. data/src/core/lib/channel/connected_channel.cc +1 -3
  187. data/src/core/lib/channel/connected_channel.h +1 -2
  188. data/src/core/lib/compression/compression.cc +2 -2
  189. data/src/core/lib/compression/compression_args.cc +6 -4
  190. data/src/core/lib/compression/compression_internal.cc +2 -2
  191. data/src/core/lib/compression/compression_internal.h +1 -1
  192. data/src/core/lib/config/core_configuration.cc +44 -2
  193. data/src/core/lib/config/core_configuration.h +39 -1
  194. data/src/core/lib/debug/stats.cc +1 -1
  195. data/src/core/lib/debug/stats_data.cc +13 -13
  196. data/src/core/lib/gpr/atm.cc +1 -1
  197. data/src/core/lib/gpr/cpu_posix.cc +1 -1
  198. data/src/core/lib/gpr/string.cc +2 -2
  199. data/src/core/lib/gpr/tls.h +1 -1
  200. data/src/core/lib/gpr/useful.h +79 -32
  201. data/src/core/lib/gprpp/arena.h +10 -0
  202. data/src/core/lib/gprpp/bitset.h +38 -16
  203. data/src/core/lib/gprpp/chunked_vector.h +211 -0
  204. data/src/core/lib/gprpp/construct_destruct.h +1 -1
  205. data/src/core/lib/gprpp/match.h +1 -1
  206. data/src/core/lib/gprpp/memory.h +6 -0
  207. data/src/core/lib/gprpp/overload.h +1 -1
  208. data/src/core/lib/gprpp/status_helper.cc +23 -3
  209. data/src/core/lib/gprpp/status_helper.h +12 -1
  210. data/src/core/lib/gprpp/table.h +411 -0
  211. data/src/core/lib/http/httpcli.cc +200 -182
  212. data/src/core/lib/http/parser.cc +2 -2
  213. data/src/core/lib/iomgr/call_combiner.cc +28 -10
  214. data/src/core/lib/iomgr/combiner.cc +6 -21
  215. data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -6
  216. data/src/core/lib/iomgr/error.cc +113 -52
  217. data/src/core/lib/iomgr/error.h +50 -9
  218. data/src/core/lib/iomgr/error_cfstream.cc +5 -0
  219. data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -2
  220. data/src/core/lib/iomgr/ev_epollex_linux.cc +7 -7
  221. data/src/core/lib/iomgr/ev_poll_posix.cc +29 -20
  222. data/src/core/lib/iomgr/event_engine/closure.cc +41 -18
  223. data/src/core/lib/iomgr/event_engine/closure.h +10 -1
  224. data/src/core/lib/iomgr/event_engine/endpoint.cc +3 -3
  225. data/src/core/lib/iomgr/event_engine/iomgr.cc +1 -1
  226. data/src/core/lib/iomgr/event_engine/pollset.cc +5 -4
  227. data/src/core/lib/iomgr/event_engine/resolver.cc +10 -7
  228. data/src/core/lib/iomgr/event_engine/tcp.cc +9 -8
  229. data/src/core/lib/iomgr/event_engine/timer.cc +7 -2
  230. data/src/core/lib/iomgr/exec_ctx.cc +1 -9
  231. data/src/core/lib/iomgr/executor/mpmcqueue.cc +5 -7
  232. data/src/core/lib/iomgr/executor/mpmcqueue.h +3 -8
  233. data/src/core/lib/iomgr/executor.cc +6 -20
  234. data/src/core/lib/iomgr/iomgr.cc +3 -1
  235. data/src/core/lib/iomgr/iomgr_internal.cc +4 -9
  236. data/src/core/lib/iomgr/iomgr_internal.h +3 -2
  237. data/src/core/lib/iomgr/load_file.cc +2 -2
  238. data/src/core/lib/iomgr/lockfree_event.cc +18 -0
  239. data/src/core/lib/iomgr/pollset_custom.cc +1 -1
  240. data/src/core/lib/iomgr/pollset_custom.h +1 -1
  241. data/src/core/lib/iomgr/resolve_address_posix.cc +5 -7
  242. data/src/core/lib/iomgr/resource_quota.cc +13 -11
  243. data/src/core/lib/iomgr/socket_factory_posix.cc +2 -2
  244. data/src/core/lib/iomgr/socket_mutator.cc +2 -2
  245. data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -2
  246. data/src/core/lib/iomgr/tcp_client_cfstream.cc +5 -3
  247. data/src/core/lib/iomgr/tcp_client_custom.cc +1 -1
  248. data/src/core/lib/iomgr/tcp_client_posix.cc +9 -18
  249. data/src/core/lib/iomgr/tcp_client_windows.cc +2 -3
  250. data/src/core/lib/iomgr/tcp_posix.cc +4 -5
  251. data/src/core/lib/iomgr/tcp_server_custom.cc +2 -1
  252. data/src/core/lib/iomgr/tcp_server_posix.cc +3 -4
  253. data/src/core/lib/iomgr/tcp_server_windows.cc +4 -5
  254. data/src/core/lib/iomgr/tcp_windows.cc +2 -2
  255. data/src/core/lib/iomgr/timer_generic.cc +13 -13
  256. data/src/core/lib/iomgr/timer_heap.cc +1 -1
  257. data/src/core/lib/json/json_util.cc +68 -0
  258. data/src/core/lib/json/json_util.h +57 -99
  259. data/src/core/lib/json/json_writer.cc +0 -3
  260. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  261. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +1 -1
  262. data/src/core/lib/security/authorization/evaluate_args.cc +14 -12
  263. data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +13 -1
  264. data/src/core/lib/security/context/security_context.cc +4 -2
  265. data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
  266. data/src/core/lib/security/credentials/credentials.cc +4 -2
  267. data/src/core/lib/security/credentials/credentials.h +6 -1
  268. data/src/core/lib/security/credentials/external/external_account_credentials.cc +47 -11
  269. data/src/core/lib/security/credentials/external/external_account_credentials.h +1 -0
  270. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +1 -1
  271. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -9
  272. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -2
  273. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +2 -2
  274. data/src/core/lib/security/security_connector/security_connector.cc +9 -4
  275. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  276. data/src/core/lib/security/security_connector/ssl_utils.cc +1 -1
  277. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +1 -0
  278. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +0 -2
  279. data/src/core/lib/security/transport/client_auth_filter.cc +5 -5
  280. data/src/core/lib/security/transport/security_handshaker.cc +73 -43
  281. data/src/core/lib/security/transport/server_auth_filter.cc +3 -5
  282. data/src/core/lib/security/transport/tsi_error.cc +3 -5
  283. data/src/core/lib/slice/slice.cc +0 -16
  284. data/src/core/lib/slice/slice_api.cc +39 -0
  285. data/src/core/lib/slice/slice_buffer.cc +5 -5
  286. data/src/core/lib/slice/slice_intern.cc +8 -13
  287. data/src/core/lib/slice/slice_internal.h +1 -244
  288. data/src/core/lib/slice/slice_refcount.cc +17 -0
  289. data/src/core/lib/slice/slice_refcount.h +121 -0
  290. data/src/core/lib/slice/slice_refcount_base.h +173 -0
  291. data/src/core/lib/slice/slice_split.cc +100 -0
  292. data/src/core/lib/slice/slice_split.h +40 -0
  293. data/src/core/lib/slice/slice_string_helpers.cc +0 -83
  294. data/src/core/lib/slice/slice_string_helpers.h +0 -11
  295. data/src/core/lib/slice/static_slice.cc +529 -0
  296. data/src/core/lib/slice/static_slice.h +331 -0
  297. data/src/core/lib/surface/builtins.cc +49 -0
  298. data/src/core/{ext/filters/workarounds/workaround_cronet_compression_filter.h → lib/surface/builtins.h} +8 -9
  299. data/src/core/lib/surface/call.cc +103 -120
  300. data/src/core/lib/surface/call.h +0 -6
  301. data/src/core/lib/surface/channel.cc +19 -32
  302. data/src/core/lib/surface/channel.h +0 -9
  303. data/src/core/lib/surface/channel_init.cc +23 -76
  304. data/src/core/lib/surface/channel_init.h +52 -44
  305. data/src/core/lib/surface/completion_queue.cc +6 -5
  306. data/src/core/lib/surface/init.cc +0 -39
  307. data/src/core/lib/surface/init_secure.cc +17 -14
  308. data/src/core/lib/surface/lame_client.cc +18 -11
  309. data/src/core/lib/surface/lame_client.h +1 -1
  310. data/src/core/lib/surface/server.cc +25 -17
  311. data/src/core/lib/surface/server.h +17 -10
  312. data/src/core/lib/surface/validate_metadata.cc +5 -2
  313. data/src/core/lib/surface/version.cc +2 -2
  314. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  315. data/src/core/lib/transport/error_utils.cc +42 -17
  316. data/src/core/lib/transport/error_utils.h +1 -1
  317. data/src/core/lib/transport/metadata.cc +31 -10
  318. data/src/core/lib/transport/metadata.h +2 -1
  319. data/src/core/lib/transport/metadata_batch.cc +35 -371
  320. data/src/core/lib/transport/metadata_batch.h +905 -71
  321. data/src/core/lib/transport/parsed_metadata.h +263 -0
  322. data/src/core/lib/transport/pid_controller.cc +4 -4
  323. data/src/core/lib/transport/static_metadata.cc +714 -846
  324. data/src/core/lib/transport/static_metadata.h +115 -379
  325. data/src/core/lib/transport/status_metadata.cc +1 -0
  326. data/src/core/lib/transport/transport.cc +4 -5
  327. data/src/core/lib/transport/transport_op_string.cc +40 -20
  328. data/src/core/plugin_registry/grpc_plugin_registry.cc +64 -43
  329. data/src/core/tsi/alts/crypt/aes_gcm.cc +3 -1
  330. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +13 -12
  331. data/src/core/tsi/alts/frame_protector/frame_handler.cc +10 -11
  332. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -2
  333. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +12 -2
  334. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
  335. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +2 -2
  336. data/src/core/tsi/fake_transport_security.cc +15 -7
  337. data/src/core/tsi/local_transport_security.cc +36 -73
  338. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +16 -50
  339. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -3
  340. data/src/core/tsi/ssl_transport_security.cc +10 -2
  341. data/src/core/tsi/transport_security.cc +12 -0
  342. data/src/core/tsi/transport_security.h +16 -1
  343. data/src/core/tsi/transport_security_interface.h +26 -0
  344. data/src/ruby/ext/grpc/extconf.rb +12 -9
  345. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  346. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  347. data/src/ruby/lib/grpc/version.rb +1 -1
  348. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -2
  349. data/src/ruby/spec/client_server_spec.rb +1 -1
  350. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +4 -4
  351. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +11 -6
  352. data/third_party/address_sorting/address_sorting_posix.c +1 -0
  353. data/third_party/boringssl-with-bazel/err_data.c +278 -272
  354. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +21 -22
  355. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c +0 -2
  356. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c +5 -0
  357. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +15 -22
  358. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +13 -7
  359. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c +19 -29
  360. data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/a_strex.c +268 -271
  361. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +106 -153
  362. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +2 -2
  363. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +0 -39
  364. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c +1 -1
  365. data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/charmap.h +0 -0
  366. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +38 -0
  367. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +8 -8
  368. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +289 -198
  369. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +8 -8
  370. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +9 -13
  371. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +1 -0
  372. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +11 -8
  373. data/third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c +1 -7
  374. data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +1 -5
  375. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +0 -4
  376. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +1 -7
  377. data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +1 -6
  378. data/third_party/boringssl-with-bazel/src/crypto/bio/socket.c +3 -17
  379. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +4 -6
  380. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c +9 -0
  381. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +8 -0
  382. data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +38 -47
  383. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c +45 -65
  384. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +1 -0
  385. data/third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c +32 -34
  386. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +21 -3
  387. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd_extra.c +3 -2
  388. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +5 -2
  389. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c +5 -9
  390. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +10 -0
  391. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/des.c +10 -11
  392. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/internal.h +1 -3
  393. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +4 -7
  394. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +4 -7
  395. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c +1 -1
  396. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +1 -1
  397. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +24 -9
  398. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +4 -2
  399. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +35 -35
  400. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +11 -10
  401. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +10 -37
  402. data/third_party/boringssl-with-bazel/src/crypto/internal.h +39 -0
  403. data/third_party/boringssl-with-bazel/src/crypto/mem.c +12 -9
  404. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c +0 -9
  405. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c +0 -2
  406. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +0 -8
  407. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c +0 -2
  408. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c +0 -4
  409. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/internal.h +16 -7
  410. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +9 -4
  411. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +151 -12
  412. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
  413. data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +6 -6
  414. data/third_party/boringssl-with-bazel/src/crypto/x509/by_file.c +2 -0
  415. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +181 -1
  416. data/third_party/boringssl-with-bazel/src/crypto/x509/name_print.c +246 -0
  417. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +11 -2
  418. data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +0 -2
  419. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +0 -179
  420. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c +4 -2
  421. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +0 -5
  422. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +1 -0
  423. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +11 -50
  424. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c +1 -1
  425. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +2 -4
  426. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +0 -16
  427. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +22 -18
  428. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +11 -8
  429. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +16 -0
  430. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +1 -0
  431. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +1 -1
  432. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h +1 -1
  433. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +1 -0
  434. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +4 -3
  435. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +24 -5
  436. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +17 -8
  437. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +3 -0
  438. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +6 -6
  439. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c +4 -0
  440. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +5 -0
  441. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c +112 -55
  442. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c +2 -1
  443. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +0 -2
  444. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
  445. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +71 -26
  446. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +366 -227
  447. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +2 -9
  448. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +10 -4
  449. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +3 -1
  450. data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +3 -3
  451. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +9 -0
  452. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +8 -2
  453. data/third_party/boringssl-with-bazel/src/include/openssl/hkdf.h +4 -0
  454. data/third_party/boringssl-with-bazel/src/include/openssl/mem.h +9 -3
  455. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +0 -20
  456. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +12 -5
  457. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +5 -0
  458. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +37 -15
  459. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +28 -14
  460. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +31 -32
  461. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +529 -91
  462. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +16 -695
  463. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +48 -8
  464. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +266 -357
  465. data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +90 -152
  466. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +15 -13
  467. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +75 -79
  468. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +96 -97
  469. data/third_party/boringssl-with-bazel/src/ssl/internal.h +63 -43
  470. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +2 -2
  471. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +2 -2
  472. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +6 -12
  473. data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +14 -17
  474. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +14 -27
  475. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +203 -203
  476. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +30 -41
  477. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +47 -33
  478. data/third_party/re2/re2/compile.cc +91 -109
  479. data/third_party/re2/re2/dfa.cc +27 -39
  480. data/third_party/re2/re2/filtered_re2.cc +18 -2
  481. data/third_party/re2/re2/filtered_re2.h +10 -5
  482. data/third_party/re2/re2/nfa.cc +1 -1
  483. data/third_party/re2/re2/parse.cc +42 -23
  484. data/third_party/re2/re2/perl_groups.cc +34 -34
  485. data/third_party/re2/re2/prefilter.cc +3 -2
  486. data/third_party/re2/re2/prog.cc +182 -4
  487. data/third_party/re2/re2/prog.h +28 -9
  488. data/third_party/re2/re2/re2.cc +87 -118
  489. data/third_party/re2/re2/re2.h +156 -141
  490. data/third_party/re2/re2/regexp.cc +12 -5
  491. data/third_party/re2/re2/regexp.h +8 -2
  492. data/third_party/re2/re2/set.cc +31 -9
  493. data/third_party/re2/re2/set.h +9 -4
  494. data/third_party/re2/re2/simplify.cc +11 -3
  495. data/third_party/re2/re2/tostring.cc +1 -1
  496. data/third_party/re2/re2/walker-inl.h +1 -1
  497. data/third_party/re2/util/mutex.h +2 -2
  498. data/third_party/re2/util/pcre.h +3 -3
  499. metadata +83 -70
  500. data/include/grpc/event_engine/slice_allocator.h +0 -71
  501. data/src/core/ext/filters/client_channel/service_config_call_data.h +0 -126
  502. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +0 -211
  503. data/src/core/ext/filters/workarounds/workaround_utils.cc +0 -53
  504. data/src/core/ext/filters/workarounds/workaround_utils.h +0 -39
  505. data/src/core/ext/transport/chttp2/client/authority.cc +0 -42
  506. data/src/core/ext/transport/chttp2/client/authority.h +0 -36
  507. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc +0 -67
  508. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h +0 -74
  509. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +0 -66
  510. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +0 -58
  511. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +0 -58
  512. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +0 -130
  513. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +0 -83
  514. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +0 -44
  515. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +0 -35
  516. data/src/core/lib/iomgr/udp_server.cc +0 -747
  517. data/src/core/lib/iomgr/udp_server.h +0 -103
  518. data/src/core/lib/transport/authority_override.cc +0 -40
  519. data/src/core/lib/transport/authority_override.h +0 -37
@@ -489,8 +489,8 @@ bool tls13_write_psk_binder(const SSL_HANDSHAKE *hs,
489
489
  return false;
490
490
  }
491
491
 
492
- OPENSSL_memcpy(msg.data() + msg.size() - verify_data_len, verify_data,
493
- verify_data_len);
492
+ auto msg_binder = msg.last(verify_data_len);
493
+ OPENSSL_memcpy(msg_binder.data(), verify_data, verify_data_len);
494
494
  if (out_binder_len != nullptr) {
495
495
  *out_binder_len = verify_data_len;
496
496
  }
@@ -537,57 +537,46 @@ size_t ssl_ech_confirmation_signal_hello_offset(const SSL *ssl) {
537
537
  ECH_CONFIRMATION_SIGNAL_LEN;
538
538
  }
539
539
 
540
- bool ssl_ech_accept_confirmation(
541
- const SSL_HANDSHAKE *hs, bssl::Span<uint8_t> out,
542
- const SSLTranscript &transcript,
543
- bssl::Span<const uint8_t> server_hello) {
544
- // We hash |server_hello|, with the last |ECH_CONFIRMATION_SIGNAL_LEN| bytes
545
- // of the random value zeroed.
546
- static const uint8_t kZeroes[ECH_CONFIRMATION_SIGNAL_LEN] = {0};
547
- const size_t offset = ssl_ech_confirmation_signal_hello_offset(hs->ssl);
548
- if (server_hello.size() < offset + ECH_CONFIRMATION_SIGNAL_LEN) {
540
+ bool ssl_ech_accept_confirmation(const SSL_HANDSHAKE *hs, Span<uint8_t> out,
541
+ Span<const uint8_t> client_random,
542
+ const SSLTranscript &transcript, bool is_hrr,
543
+ Span<const uint8_t> msg, size_t offset) {
544
+ // See draft-ietf-tls-esni-13, sections 7.2 and 7.2.1.
545
+ static const uint8_t kZeros[EVP_MAX_MD_SIZE] = {0};
546
+
547
+ // We hash |msg|, with bytes from |offset| zeroed.
548
+ if (msg.size() < offset + ECH_CONFIRMATION_SIGNAL_LEN) {
549
549
  OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
550
550
  return false;
551
551
  }
552
552
 
553
- auto before_zeroes = server_hello.subspan(0, offset);
554
- auto after_zeroes =
555
- server_hello.subspan(offset + ECH_CONFIRMATION_SIGNAL_LEN);
556
- uint8_t context_hash[EVP_MAX_MD_SIZE];
557
- unsigned context_hash_len;
553
+ auto before_zeros = msg.subspan(0, offset);
554
+ auto after_zeros = msg.subspan(offset + ECH_CONFIRMATION_SIGNAL_LEN);
555
+ uint8_t context[EVP_MAX_MD_SIZE];
556
+ unsigned context_len;
558
557
  ScopedEVP_MD_CTX ctx;
559
558
  if (!transcript.CopyToHashContext(ctx.get(), transcript.Digest()) ||
560
- !EVP_DigestUpdate(ctx.get(), before_zeroes.data(),
561
- before_zeroes.size()) ||
562
- !EVP_DigestUpdate(ctx.get(), kZeroes, sizeof(kZeroes)) ||
563
- !EVP_DigestUpdate(ctx.get(), after_zeroes.data(), after_zeroes.size()) ||
564
- !EVP_DigestFinal_ex(ctx.get(), context_hash, &context_hash_len)) {
559
+ !EVP_DigestUpdate(ctx.get(), before_zeros.data(), before_zeros.size()) ||
560
+ !EVP_DigestUpdate(ctx.get(), kZeros, ECH_CONFIRMATION_SIGNAL_LEN) ||
561
+ !EVP_DigestUpdate(ctx.get(), after_zeros.data(), after_zeros.size()) ||
562
+ !EVP_DigestFinal_ex(ctx.get(), context, &context_len)) {
565
563
  return false;
566
564
  }
567
565
 
568
- // Per draft-ietf-tls-esni-10, accept_confirmation is computed with
569
- // Derive-Secret, which derives a secret of size Hash.length. That value is
570
- // then truncated to the first 8 bytes. Note this differs from deriving an
571
- // 8-byte secret because the target length is included in the derivation.
572
- //
573
- // TODO(https://crbug.com/boringssl/275): draft-11 will avoid this.
574
- uint8_t accept_confirmation_buf[EVP_MAX_MD_SIZE];
575
- bssl::Span<uint8_t> accept_confirmation =
576
- MakeSpan(accept_confirmation_buf, transcript.DigestLen());
577
- if (!hkdf_expand_label(accept_confirmation, transcript.Digest(),
578
- hs->secret(), label_to_span("ech accept confirmation"),
579
- MakeConstSpan(context_hash, context_hash_len))) {
566
+ uint8_t secret[EVP_MAX_MD_SIZE];
567
+ size_t secret_len;
568
+ if (!HKDF_extract(secret, &secret_len, transcript.Digest(),
569
+ client_random.data(), client_random.size(), kZeros,
570
+ transcript.DigestLen())) {
580
571
  return false;
581
572
  }
582
573
 
583
- static_assert(ECH_CONFIRMATION_SIGNAL_LEN < EVP_MAX_MD_SIZE,
584
- "ECH confirmation signal too big");
585
- if (out.size() != ECH_CONFIRMATION_SIGNAL_LEN) {
586
- OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
587
- return false;
588
- }
589
- OPENSSL_memcpy(out.data(), accept_confirmation.data(), out.size());
590
- return true;
574
+ assert(out.size() == ECH_CONFIRMATION_SIGNAL_LEN);
575
+ return hkdf_expand_label(out, transcript.Digest(),
576
+ MakeConstSpan(secret, secret_len),
577
+ is_hrr ? label_to_span("hrr ech accept confirmation")
578
+ : label_to_span("ech accept confirmation"),
579
+ MakeConstSpan(context, context_len));
591
580
  }
592
581
 
593
582
  BSSL_NAMESPACE_END
@@ -246,8 +246,7 @@ static enum ssl_hs_wait_t do_select_parameters(SSL_HANDSHAKE *hs) {
246
246
  return ssl_hs_error;
247
247
  }
248
248
 
249
- // The PRF hash is now known. Set up the key schedule and hash the
250
- // ClientHello.
249
+ // The PRF hash is now known.
251
250
  if (!hs->transcript.InitHash(ssl_protocol_version(ssl), hs->new_cipher)) {
252
251
  return ssl_hs_error;
253
252
  }
@@ -270,7 +269,7 @@ static enum ssl_ticket_aead_result_t select_session(
270
269
  return ssl_ticket_aead_ignore_ticket;
271
270
  }
272
271
 
273
- // Per RFC8446, section 4.2.9, servers MUST abort the handshake if the client
272
+ // Per RFC 8446, section 4.2.9, servers MUST abort the handshake if the client
274
273
  // sends pre_shared_key without psk_key_exchange_modes.
275
274
  CBS unused;
276
275
  if (!ssl_client_hello_get_extension(client_hello, &unused,
@@ -571,12 +570,34 @@ static enum ssl_hs_wait_t do_send_hello_retry_request(SSL_HANDSHAKE *hs) {
571
570
  !CBB_add_u16(&extensions, ssl->version) ||
572
571
  !CBB_add_u16(&extensions, TLSEXT_TYPE_key_share) ||
573
572
  !CBB_add_u16(&extensions, 2 /* length */) ||
574
- !CBB_add_u16(&extensions, group_id) ||
575
- !ssl_add_message_cbb(ssl, cbb.get())) {
573
+ !CBB_add_u16(&extensions, group_id)) {
576
574
  return ssl_hs_error;
577
575
  }
576
+ if (hs->ech_is_inner) {
577
+ // Fill a placeholder for the ECH confirmation value.
578
+ if (!CBB_add_u16(&extensions, TLSEXT_TYPE_encrypted_client_hello) ||
579
+ !CBB_add_u16(&extensions, ECH_CONFIRMATION_SIGNAL_LEN) ||
580
+ !CBB_add_zeros(&extensions, ECH_CONFIRMATION_SIGNAL_LEN)) {
581
+ return ssl_hs_error;
582
+ }
583
+ }
584
+ Array<uint8_t> hrr;
585
+ if (!ssl->method->finish_message(ssl, cbb.get(), &hrr)) {
586
+ return ssl_hs_error;
587
+ }
588
+ if (hs->ech_is_inner) {
589
+ // Now that the message is encoded, fill in the whole value.
590
+ size_t offset = hrr.size() - ECH_CONFIRMATION_SIGNAL_LEN;
591
+ if (!ssl_ech_accept_confirmation(
592
+ hs, MakeSpan(hrr).last(ECH_CONFIRMATION_SIGNAL_LEN),
593
+ ssl->s3->client_random, hs->transcript, /*is_hrr=*/true, hrr,
594
+ offset)) {
595
+ return ssl_hs_error;
596
+ }
597
+ }
578
598
 
579
- if (!ssl->method->add_change_cipher_spec(ssl)) {
599
+ if (!ssl->method->add_message(ssl, std::move(hrr)) ||
600
+ !ssl->method->add_change_cipher_spec(ssl)) {
580
601
  return ssl_hs_error;
581
602
  }
582
603
 
@@ -602,8 +623,8 @@ static enum ssl_hs_wait_t do_read_second_client_hello(SSL_HANDSHAKE *hs) {
602
623
  }
603
624
 
604
625
  if (ssl->s3->ech_status == ssl_ech_accepted) {
605
- // If we previously accepted the ClientHelloInner, check that the second
606
- // ClientHello contains an encrypted_client_hello extension.
626
+ // If we previously accepted the ClientHelloInner, the second ClientHello
627
+ // must contain an outer encrypted_client_hello extension.
607
628
  CBS ech_body;
608
629
  if (!ssl_client_hello_get_extension(&client_hello, &ech_body,
609
630
  TLSEXT_TYPE_encrypted_client_hello)) {
@@ -611,12 +632,12 @@ static enum ssl_hs_wait_t do_read_second_client_hello(SSL_HANDSHAKE *hs) {
611
632
  ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_MISSING_EXTENSION);
612
633
  return ssl_hs_error;
613
634
  }
614
-
615
- // Parse a ClientECH out of the extension body.
616
635
  uint16_t kdf_id, aead_id;
617
- uint8_t config_id;
636
+ uint8_t type, config_id;
618
637
  CBS enc, payload;
619
- if (!CBS_get_u16(&ech_body, &kdf_id) || //
638
+ if (!CBS_get_u8(&ech_body, &type) || //
639
+ type != ECH_CLIENT_OUTER || //
640
+ !CBS_get_u16(&ech_body, &kdf_id) || //
620
641
  !CBS_get_u16(&ech_body, &aead_id) ||
621
642
  !CBS_get_u8(&ech_body, &config_id) ||
622
643
  !CBS_get_u16_length_prefixed(&ech_body, &enc) ||
@@ -627,8 +648,6 @@ static enum ssl_hs_wait_t do_read_second_client_hello(SSL_HANDSHAKE *hs) {
627
648
  return ssl_hs_error;
628
649
  }
629
650
 
630
- // Check that ClientECH.cipher_suite is unchanged and that
631
- // ClientECH.enc is empty.
632
651
  if (kdf_id != EVP_HPKE_KDF_id(EVP_HPKE_CTX_kdf(hs->ech_hpke_ctx.get())) ||
633
652
  aead_id !=
634
653
  EVP_HPKE_AEAD_id(EVP_HPKE_CTX_aead(hs->ech_hpke_ctx.get())) ||
@@ -641,9 +660,9 @@ static enum ssl_hs_wait_t do_read_second_client_hello(SSL_HANDSHAKE *hs) {
641
660
  // Decrypt the payload with the HPKE context from the first ClientHello.
642
661
  Array<uint8_t> encoded_client_hello_inner;
643
662
  bool unused;
644
- if (!ssl_client_hello_decrypt(
645
- hs->ech_hpke_ctx.get(), &encoded_client_hello_inner, &unused,
646
- &client_hello, kdf_id, aead_id, config_id, enc, payload)) {
663
+ if (!ssl_client_hello_decrypt(hs->ech_hpke_ctx.get(),
664
+ &encoded_client_hello_inner, &unused,
665
+ &client_hello, payload)) {
647
666
  // Decryption failure is fatal in the second ClientHello.
648
667
  OPENSSL_PUT_ERROR(SSL, SSL_R_DECRYPTION_FAILED);
649
668
  ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECRYPT_ERROR);
@@ -761,18 +780,18 @@ static enum ssl_hs_wait_t do_send_server_hello(SSL_HANDSHAKE *hs) {
761
780
  return ssl_hs_error;
762
781
  }
763
782
 
764
- assert(ssl->s3->ech_status != ssl_ech_accepted || hs->ech_is_inner_present);
765
- if (hs->ech_is_inner_present) {
783
+ assert(ssl->s3->ech_status != ssl_ech_accepted || hs->ech_is_inner);
784
+ if (hs->ech_is_inner) {
766
785
  // Fill in the ECH confirmation signal.
767
- Span<uint8_t> random_suffix =
768
- random.subspan(SSL3_RANDOM_SIZE - ECH_CONFIRMATION_SIGNAL_LEN);
769
- if (!ssl_ech_accept_confirmation(hs, random_suffix, hs->transcript,
770
- server_hello)) {
786
+ const size_t offset = ssl_ech_confirmation_signal_hello_offset(ssl);
787
+ Span<uint8_t> random_suffix = random.last(ECH_CONFIRMATION_SIGNAL_LEN);
788
+ if (!ssl_ech_accept_confirmation(hs, random_suffix, ssl->s3->client_random,
789
+ hs->transcript,
790
+ /*is_hrr=*/false, server_hello, offset)) {
771
791
  return ssl_hs_error;
772
792
  }
773
793
 
774
794
  // Update |server_hello|.
775
- const size_t offset = ssl_ech_confirmation_signal_hello_offset(ssl);
776
795
  Span<uint8_t> server_hello_out =
777
796
  MakeSpan(server_hello).subspan(offset, ECH_CONFIRMATION_SIGNAL_LEN);
778
797
  OPENSSL_memcpy(server_hello_out.data(), random_suffix.data(),
@@ -1041,20 +1060,15 @@ static enum ssl_hs_wait_t do_read_client_encrypted_extensions(
1041
1060
  return ssl_hs_error;
1042
1061
  }
1043
1062
 
1044
- // Parse out the extensions.
1045
- bool have_application_settings = false;
1046
- CBS application_settings;
1047
- SSL_EXTENSION_TYPE ext_types[] = {{TLSEXT_TYPE_application_settings,
1048
- &have_application_settings,
1049
- &application_settings}};
1063
+ SSLExtension application_settings(TLSEXT_TYPE_application_settings);
1050
1064
  uint8_t alert = SSL_AD_DECODE_ERROR;
1051
- if (!ssl_parse_extensions(&extensions, &alert, ext_types,
1065
+ if (!ssl_parse_extensions(&extensions, &alert, {&application_settings},
1052
1066
  /*ignore_unknown=*/false)) {
1053
1067
  ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
1054
1068
  return ssl_hs_error;
1055
1069
  }
1056
1070
 
1057
- if (!have_application_settings) {
1071
+ if (!application_settings.present) {
1058
1072
  OPENSSL_PUT_ERROR(SSL, SSL_R_MISSING_EXTENSION);
1059
1073
  ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_MISSING_EXTENSION);
1060
1074
  return ssl_hs_error;
@@ -1063,7 +1077,7 @@ static enum ssl_hs_wait_t do_read_client_encrypted_extensions(
1063
1077
  // Note that, if 0-RTT was accepted, these values will already have been
1064
1078
  // initialized earlier.
1065
1079
  if (!hs->new_session->peer_application_settings.CopyFrom(
1066
- application_settings) ||
1080
+ application_settings.data) ||
1067
1081
  !ssl_hash_message(hs, msg)) {
1068
1082
  ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
1069
1083
  return ssl_hs_error;
@@ -30,92 +30,60 @@ namespace re2 {
30
30
  // See http://swtch.com/~rsc/regexp/regexp1.html for inspiration.
31
31
  //
32
32
  // Because the out and out1 fields in Inst are no longer pointers,
33
- // we can't use pointers directly here either. Instead, p refers
34
- // to inst_[p>>1].out (p&1 == 0) or inst_[p>>1].out1 (p&1 == 1).
35
- // p == 0 represents the NULL list. This is okay because instruction #0
33
+ // we can't use pointers directly here either. Instead, head refers
34
+ // to inst_[head>>1].out (head&1 == 0) or inst_[head>>1].out1 (head&1 == 1).
35
+ // head == 0 represents the NULL list. This is okay because instruction #0
36
36
  // is always the fail instruction, which never appears on a list.
37
-
38
37
  struct PatchList {
39
- uint32_t p;
40
-
41
38
  // Returns patch list containing just p.
42
- static PatchList Mk(uint32_t p);
39
+ static PatchList Mk(uint32_t p) {
40
+ return {p, p};
41
+ }
43
42
 
44
- // Patches all the entries on l to have value v.
43
+ // Patches all the entries on l to have value p.
45
44
  // Caller must not ever use patch list again.
46
- static void Patch(Prog::Inst *inst0, PatchList l, uint32_t v);
47
-
48
- // Deref returns the next pointer pointed at by p.
49
- static PatchList Deref(Prog::Inst *inst0, PatchList l);
50
-
51
- // Appends two patch lists and returns result.
52
- static PatchList Append(Prog::Inst *inst0, PatchList l1, PatchList l2);
53
- };
54
-
55
- static PatchList nullPatchList = { 0 };
56
-
57
- // Returns patch list containing just p.
58
- PatchList PatchList::Mk(uint32_t p) {
59
- PatchList l;
60
- l.p = p;
61
- return l;
62
- }
63
-
64
- // Returns the next pointer pointed at by l.
65
- PatchList PatchList::Deref(Prog::Inst* inst0, PatchList l) {
66
- Prog::Inst* ip = &inst0[l.p>>1];
67
- if (l.p&1)
68
- l.p = ip->out1();
69
- else
70
- l.p = ip->out();
71
- return l;
72
- }
73
-
74
- // Patches all the entries on l to have value v.
75
- void PatchList::Patch(Prog::Inst *inst0, PatchList l, uint32_t val) {
76
- while (l.p != 0) {
77
- Prog::Inst* ip = &inst0[l.p>>1];
78
- if (l.p&1) {
79
- l.p = ip->out1();
80
- ip->out1_ = val;
81
- } else {
82
- l.p = ip->out();
83
- ip->set_out(val);
45
+ static void Patch(Prog::Inst* inst0, PatchList l, uint32_t p) {
46
+ while (l.head != 0) {
47
+ Prog::Inst* ip = &inst0[l.head>>1];
48
+ if (l.head&1) {
49
+ l.head = ip->out1();
50
+ ip->out1_ = p;
51
+ } else {
52
+ l.head = ip->out();
53
+ ip->set_out(p);
54
+ }
84
55
  }
85
56
  }
86
- }
87
57
 
88
- // Appends two patch lists and returns result.
89
- PatchList PatchList::Append(Prog::Inst* inst0, PatchList l1, PatchList l2) {
90
- if (l1.p == 0)
91
- return l2;
92
- if (l2.p == 0)
93
- return l1;
94
-
95
- PatchList l = l1;
96
- for (;;) {
97
- PatchList next = PatchList::Deref(inst0, l);
98
- if (next.p == 0)
99
- break;
100
- l = next;
58
+ // Appends two patch lists and returns result.
59
+ static PatchList Append(Prog::Inst* inst0, PatchList l1, PatchList l2) {
60
+ if (l1.head == 0)
61
+ return l2;
62
+ if (l2.head == 0)
63
+ return l1;
64
+ Prog::Inst* ip = &inst0[l1.tail>>1];
65
+ if (l1.tail&1)
66
+ ip->out1_ = l2.head;
67
+ else
68
+ ip->set_out(l2.head);
69
+ return {l1.head, l2.tail};
101
70
  }
102
71
 
103
- Prog::Inst* ip = &inst0[l.p>>1];
104
- if (l.p&1)
105
- ip->out1_ = l2.p;
106
- else
107
- ip->set_out(l2.p);
72
+ uint32_t head;
73
+ uint32_t tail; // for constant-time append
74
+ };
108
75
 
109
- return l1;
110
- }
76
+ static const PatchList kNullPatchList = {0, 0};
111
77
 
112
78
  // Compiled program fragment.
113
79
  struct Frag {
114
80
  uint32_t begin;
115
81
  PatchList end;
82
+ bool nullable;
116
83
 
117
- Frag() : begin(0) { end.p = 0; } // needed so Frag can go in vector
118
- Frag(uint32_t begin, PatchList end) : begin(begin), end(end) {}
84
+ Frag() : begin(0), end(kNullPatchList), nullable(false) {}
85
+ Frag(uint32_t begin, PatchList end, bool nullable)
86
+ : begin(begin), end(end), nullable(nullable) {}
119
87
  };
120
88
 
121
89
  // Input encodings.
@@ -212,8 +180,8 @@ class Compiler : public Regexp::Walker<Frag> {
212
180
  int AddSuffixRecursive(int root, int id);
213
181
 
214
182
  // Finds the trie node for the given suffix. Returns a Frag in order to
215
- // distinguish between pointing at the root node directly (end.p == 0)
216
- // and pointing at an Alt's out1 or out (end.p&1 == 1 or 0, respectively).
183
+ // distinguish between pointing at the root node directly (end.head == 0)
184
+ // and pointing at an Alt's out1 or out (end.head&1 == 1 or 0, respectively).
217
185
  Frag FindByteRange(int root, int id);
218
186
 
219
187
  // Compares two ByteRanges and returns true iff they are equal.
@@ -298,7 +266,7 @@ int Compiler::AllocInst(int n) {
298
266
 
299
267
  // Returns an unmatchable fragment.
300
268
  Frag Compiler::NoMatch() {
301
- return Frag(0, nullPatchList);
269
+ return Frag();
302
270
  }
303
271
 
304
272
  // Is a an unmatchable fragment?
@@ -314,7 +282,7 @@ Frag Compiler::Cat(Frag a, Frag b) {
314
282
  // Elide no-op.
315
283
  Prog::Inst* begin = &inst_[a.begin];
316
284
  if (begin->opcode() == kInstNop &&
317
- a.end.p == (a.begin << 1) &&
285
+ a.end.head == (a.begin << 1) &&
318
286
  begin->out() == 0) {
319
287
  // in case refs to a somewhere
320
288
  PatchList::Patch(inst_.data(), a.end, b.begin);
@@ -324,11 +292,11 @@ Frag Compiler::Cat(Frag a, Frag b) {
324
292
  // To run backward over string, reverse all concatenations.
325
293
  if (reversed_) {
326
294
  PatchList::Patch(inst_.data(), b.end, a.begin);
327
- return Frag(b.begin, a.end);
295
+ return Frag(b.begin, a.end, b.nullable && a.nullable);
328
296
  }
329
297
 
330
298
  PatchList::Patch(inst_.data(), a.end, b.begin);
331
- return Frag(a.begin, b.end);
299
+ return Frag(a.begin, b.end, a.nullable && b.nullable);
332
300
  }
333
301
 
334
302
  // Given fragments for a and b, returns fragment for a|b.
@@ -344,7 +312,8 @@ Frag Compiler::Alt(Frag a, Frag b) {
344
312
  return NoMatch();
345
313
 
346
314
  inst_[id].InitAlt(a.begin, b.begin);
347
- return Frag(id, PatchList::Append(inst_.data(), a.end, b.end));
315
+ return Frag(id, PatchList::Append(inst_.data(), a.end, b.end),
316
+ a.nullable || b.nullable);
348
317
  }
349
318
 
350
319
  // When capturing submatches in like-Perl mode, a kOpAlt Inst
@@ -354,27 +323,44 @@ Frag Compiler::Alt(Frag a, Frag b) {
354
323
  // then the operator is greedy. If out1_ is the repetition
355
324
  // (and out_ moves forward), then the operator is non-greedy.
356
325
 
357
- // Given a fragment a, returns a fragment for a* or a*? (if nongreedy)
358
- Frag Compiler::Star(Frag a, bool nongreedy) {
326
+ // Given a fragment for a, returns a fragment for a+ or a+? (if nongreedy)
327
+ Frag Compiler::Plus(Frag a, bool nongreedy) {
359
328
  int id = AllocInst(1);
360
329
  if (id < 0)
361
330
  return NoMatch();
362
- inst_[id].InitAlt(0, 0);
363
- PatchList::Patch(inst_.data(), a.end, id);
331
+ PatchList pl;
364
332
  if (nongreedy) {
365
- inst_[id].out1_ = a.begin;
366
- return Frag(id, PatchList::Mk(id << 1));
333
+ inst_[id].InitAlt(0, a.begin);
334
+ pl = PatchList::Mk(id << 1);
367
335
  } else {
368
- inst_[id].set_out(a.begin);
369
- return Frag(id, PatchList::Mk((id << 1) | 1));
336
+ inst_[id].InitAlt(a.begin, 0);
337
+ pl = PatchList::Mk((id << 1) | 1);
370
338
  }
339
+ PatchList::Patch(inst_.data(), a.end, id);
340
+ return Frag(a.begin, pl, a.nullable);
371
341
  }
372
342
 
373
- // Given a fragment for a, returns a fragment for a+ or a+? (if nongreedy)
374
- Frag Compiler::Plus(Frag a, bool nongreedy) {
375
- // a+ is just a* with a different entry point.
376
- Frag f = Star(a, nongreedy);
377
- return Frag(a.begin, f.end);
343
+ // Given a fragment for a, returns a fragment for a* or a*? (if nongreedy)
344
+ Frag Compiler::Star(Frag a, bool nongreedy) {
345
+ // When the subexpression is nullable, one Alt isn't enough to guarantee
346
+ // correct priority ordering within the transitive closure. The simplest
347
+ // solution is to handle it as (a+)? instead, which adds the second Alt.
348
+ if (a.nullable)
349
+ return Quest(Plus(a, nongreedy), nongreedy);
350
+
351
+ int id = AllocInst(1);
352
+ if (id < 0)
353
+ return NoMatch();
354
+ PatchList pl;
355
+ if (nongreedy) {
356
+ inst_[id].InitAlt(0, a.begin);
357
+ pl = PatchList::Mk(id << 1);
358
+ } else {
359
+ inst_[id].InitAlt(a.begin, 0);
360
+ pl = PatchList::Mk((id << 1) | 1);
361
+ }
362
+ PatchList::Patch(inst_.data(), a.end, id);
363
+ return Frag(id, pl, true);
378
364
  }
379
365
 
380
366
  // Given a fragment for a, returns a fragment for a? or a?? (if nongreedy)
@@ -392,7 +378,7 @@ Frag Compiler::Quest(Frag a, bool nongreedy) {
392
378
  inst_[id].InitAlt(a.begin, 0);
393
379
  pl = PatchList::Mk((id << 1) | 1);
394
380
  }
395
- return Frag(id, PatchList::Append(inst_.data(), pl, a.end));
381
+ return Frag(id, PatchList::Append(inst_.data(), pl, a.end), true);
396
382
  }
397
383
 
398
384
  // Returns a fragment for the byte range lo-hi.
@@ -401,7 +387,7 @@ Frag Compiler::ByteRange(int lo, int hi, bool foldcase) {
401
387
  if (id < 0)
402
388
  return NoMatch();
403
389
  inst_[id].InitByteRange(lo, hi, foldcase, 0);
404
- return Frag(id, PatchList::Mk(id << 1));
390
+ return Frag(id, PatchList::Mk(id << 1), false);
405
391
  }
406
392
 
407
393
  // Returns a no-op fragment. Sometimes unavoidable.
@@ -410,7 +396,7 @@ Frag Compiler::Nop() {
410
396
  if (id < 0)
411
397
  return NoMatch();
412
398
  inst_[id].InitNop(0);
413
- return Frag(id, PatchList::Mk(id << 1));
399
+ return Frag(id, PatchList::Mk(id << 1), true);
414
400
  }
415
401
 
416
402
  // Returns a fragment that signals a match.
@@ -419,7 +405,7 @@ Frag Compiler::Match(int32_t match_id) {
419
405
  if (id < 0)
420
406
  return NoMatch();
421
407
  inst_[id].InitMatch(match_id);
422
- return Frag(id, nullPatchList);
408
+ return Frag(id, kNullPatchList, false);
423
409
  }
424
410
 
425
411
  // Returns a fragment matching a particular empty-width op (like ^ or $)
@@ -428,7 +414,7 @@ Frag Compiler::EmptyWidth(EmptyOp empty) {
428
414
  if (id < 0)
429
415
  return NoMatch();
430
416
  inst_[id].InitEmptyWidth(empty, 0);
431
- return Frag(id, PatchList::Mk(id << 1));
417
+ return Frag(id, PatchList::Mk(id << 1), true);
432
418
  }
433
419
 
434
420
  // Given a fragment a, returns a fragment with capturing parens around a.
@@ -442,7 +428,7 @@ Frag Compiler::Capture(Frag a, int n) {
442
428
  inst_[id+1].InitCapture(2*n+1, 0);
443
429
  PatchList::Patch(inst_.data(), a.end, id+1);
444
430
 
445
- return Frag(id, PatchList::Mk((id+1) << 1));
431
+ return Frag(id, PatchList::Mk((id+1) << 1), a.nullable);
446
432
  }
447
433
 
448
434
  // A Rune is a name for a Unicode code point.
@@ -467,7 +453,7 @@ static int MaxRune(int len) {
467
453
  void Compiler::BeginRange() {
468
454
  rune_cache_.clear();
469
455
  rune_range_.begin = 0;
470
- rune_range_.end = nullPatchList;
456
+ rune_range_.end = kNullPatchList;
471
457
  }
472
458
 
473
459
  int Compiler::UncachedRuneByteSuffix(uint8_t lo, uint8_t hi, bool foldcase,
@@ -548,9 +534,9 @@ int Compiler::AddSuffixRecursive(int root, int id) {
548
534
  }
549
535
 
550
536
  int br;
551
- if (f.end.p == 0)
537
+ if (f.end.head == 0)
552
538
  br = root;
553
- else if (f.end.p&1)
539
+ else if (f.end.head&1)
554
540
  br = inst_[f.begin].out1();
555
541
  else
556
542
  br = inst_[f.begin].out();
@@ -566,9 +552,9 @@ int Compiler::AddSuffixRecursive(int root, int id) {
566
552
  // Ensure that the parent points to the clone, not to the original.
567
553
  // Note that this could leave the head unreachable except via the cache.
568
554
  br = byterange;
569
- if (f.end.p == 0)
555
+ if (f.end.head == 0)
570
556
  root = br;
571
- else if (f.end.p&1)
557
+ else if (f.end.head&1)
572
558
  inst_[f.begin].out1_ = br;
573
559
  else
574
560
  inst_[f.begin].set_out(br);
@@ -601,7 +587,7 @@ bool Compiler::ByteRangeEqual(int id1, int id2) {
601
587
  Frag Compiler::FindByteRange(int root, int id) {
602
588
  if (inst_[root].opcode() == kInstByteRange) {
603
589
  if (ByteRangeEqual(root, id))
604
- return Frag(root, nullPatchList);
590
+ return Frag(root, kNullPatchList, false);
605
591
  else
606
592
  return NoMatch();
607
593
  }
@@ -609,7 +595,7 @@ Frag Compiler::FindByteRange(int root, int id) {
609
595
  while (inst_[root].opcode() == kInstAlt) {
610
596
  int out1 = inst_[root].out1();
611
597
  if (ByteRangeEqual(out1, id))
612
- return Frag(root, PatchList::Mk((root << 1) | 1));
598
+ return Frag(root, PatchList::Mk((root << 1) | 1), false);
613
599
 
614
600
  // CharClass is a sorted list of ranges, so if out1 of the root Alt wasn't
615
601
  // what we're looking for, then we can stop immediately. Unfortunately, we
@@ -621,7 +607,7 @@ Frag Compiler::FindByteRange(int root, int id) {
621
607
  if (inst_[out].opcode() == kInstAlt)
622
608
  root = out;
623
609
  else if (ByteRangeEqual(out, id))
624
- return Frag(root, PatchList::Mk(root << 1));
610
+ return Frag(root, PatchList::Mk(root << 1), false);
625
611
  else
626
612
  return NoMatch();
627
613
  }
@@ -1190,12 +1176,8 @@ Prog* Compiler::Finish(Regexp* re) {
1190
1176
  if (!prog_->reversed()) {
1191
1177
  std::string prefix;
1192
1178
  bool prefix_foldcase;
1193
- if (re->RequiredPrefixForAccel(&prefix, &prefix_foldcase) &&
1194
- !prefix_foldcase) {
1195
- prog_->prefix_size_ = prefix.size();
1196
- prog_->prefix_front_ = prefix.front();
1197
- prog_->prefix_back_ = prefix.back();
1198
- }
1179
+ if (re->RequiredPrefixForAccel(&prefix, &prefix_foldcase))
1180
+ prog_->ConfigurePrefixAccel(prefix, prefix_foldcase);
1199
1181
  }
1200
1182
 
1201
1183
  // Record remaining memory for DFA.