grpc 1.73.0 → 1.75.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 (786) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +116 -53
  3. data/include/grpc/create_channel_from_endpoint.h +54 -0
  4. data/include/grpc/credentials.h +18 -6
  5. data/include/grpc/event_engine/event_engine.h +74 -17
  6. data/include/grpc/grpc_posix.h +20 -1
  7. data/include/grpc/impl/channel_arg_names.h +2 -4
  8. data/include/grpc/module.modulemap +1 -0
  9. data/include/grpc/support/json.h +24 -0
  10. data/src/core/call/client_call.cc +4 -4
  11. data/src/core/call/filter_fusion.h +1230 -0
  12. data/src/core/call/interception_chain.h +7 -11
  13. data/src/core/call/metadata.cc +22 -0
  14. data/src/core/call/metadata.h +24 -2
  15. data/src/core/channelz/channel_trace.cc +213 -115
  16. data/src/core/channelz/channel_trace.h +380 -86
  17. data/src/core/channelz/channelz.cc +274 -192
  18. data/src/core/channelz/channelz.h +224 -72
  19. data/src/core/channelz/channelz_registry.cc +2 -163
  20. data/src/core/channelz/channelz_registry.h +37 -6
  21. data/src/core/channelz/property_list.cc +353 -0
  22. data/src/core/channelz/property_list.h +204 -0
  23. data/src/core/channelz/v2tov1/convert.cc +683 -0
  24. data/src/core/channelz/v2tov1/convert.h +58 -0
  25. data/src/core/channelz/v2tov1/legacy_api.cc +425 -0
  26. data/src/core/channelz/v2tov1/legacy_api.h +32 -0
  27. data/src/core/channelz/v2tov1/property_list.cc +118 -0
  28. data/src/core/channelz/v2tov1/property_list.h +52 -0
  29. data/src/core/channelz/ztrace_collector.h +3 -2
  30. data/src/core/client_channel/backup_poller.cc +17 -2
  31. data/src/core/client_channel/client_channel.cc +17 -28
  32. data/src/core/client_channel/client_channel_filter.cc +24 -33
  33. data/src/core/client_channel/client_channel_filter.h +2 -2
  34. data/src/core/client_channel/client_channel_internal.h +2 -1
  35. data/src/core/client_channel/config_selector.h +8 -2
  36. data/src/core/client_channel/dynamic_filters.cc +5 -6
  37. data/src/core/client_channel/dynamic_filters.h +1 -1
  38. data/src/core/client_channel/global_subchannel_pool.cc +4 -1
  39. data/src/core/client_channel/load_balanced_call_destination.cc +6 -5
  40. data/src/core/client_channel/retry_filter.cc +21 -27
  41. data/src/core/client_channel/retry_filter.h +10 -7
  42. data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -5
  43. data/src/core/client_channel/retry_filter_legacy_call_data.h +1 -1
  44. data/src/core/client_channel/retry_interceptor.cc +30 -44
  45. data/src/core/client_channel/retry_interceptor.h +18 -17
  46. data/src/core/client_channel/retry_throttle.cc +46 -61
  47. data/src/core/client_channel/retry_throttle.h +17 -39
  48. data/src/core/client_channel/subchannel.cc +57 -25
  49. data/src/core/client_channel/subchannel.h +10 -0
  50. data/src/core/config/config_vars.cc +2 -0
  51. data/src/core/config/core_configuration.cc +4 -1
  52. data/src/core/config/core_configuration.h +23 -0
  53. data/src/core/credentials/call/call_creds_registry.h +125 -0
  54. data/src/core/credentials/call/call_creds_registry_init.cc +91 -0
  55. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +6 -48
  56. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +86 -0
  57. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.h +74 -0
  58. data/src/core/credentials/call/jwt_util.cc +70 -0
  59. data/src/core/credentials/call/jwt_util.h +32 -0
  60. data/src/core/credentials/transport/alts/alts_credentials.cc +5 -0
  61. data/src/core/credentials/transport/alts/check_gcp_environment_windows.cc +2 -0
  62. data/src/core/credentials/transport/channel_creds_registry_init.cc +4 -2
  63. data/src/core/credentials/transport/google_default/google_default_credentials.cc +72 -4
  64. data/src/core/credentials/transport/ssl/ssl_credentials.cc +1 -2
  65. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +8 -3
  66. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +29 -24
  67. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +19 -8
  68. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +96 -54
  69. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +15 -2
  70. data/src/core/credentials/transport/tls/load_system_roots_supported.cc +1 -0
  71. data/src/core/credentials/transport/tls/spiffe_utils.cc +371 -0
  72. data/src/core/credentials/transport/tls/spiffe_utils.h +171 -0
  73. data/src/core/credentials/transport/tls/ssl_utils.cc +11 -10
  74. data/src/core/credentials/transport/tls/ssl_utils.h +4 -2
  75. data/src/core/credentials/transport/tls/tls_credentials.cc +2 -0
  76. data/src/core/credentials/transport/tls/tls_security_connector.cc +11 -26
  77. data/src/core/credentials/transport/tls/tls_security_connector.h +12 -12
  78. data/src/core/credentials/transport/xds/xds_credentials.cc +0 -3
  79. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +1 -2
  80. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +8 -8
  81. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +16 -16
  82. data/src/core/ext/filters/http/client/http_client_filter.cc +3 -6
  83. data/src/core/ext/filters/http/client_authority_filter.cc +3 -6
  84. data/src/core/ext/filters/http/message_compress/compression_filter.cc +8 -8
  85. data/src/core/ext/filters/http/message_compress/compression_filter.h +25 -22
  86. data/src/core/ext/filters/http/server/http_server_filter.cc +3 -6
  87. data/src/core/ext/filters/http/server/http_server_filter.h +12 -11
  88. data/src/core/ext/filters/message_size/message_size_filter.cc +4 -4
  89. data/src/core/ext/filters/rbac/rbac_filter.cc +1 -1
  90. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +3 -5
  91. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +120 -35
  92. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +6 -5
  93. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +165 -117
  94. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +0 -3
  95. data/src/core/ext/transport/chttp2/transport/decode_huff.cc +1239 -3514
  96. data/src/core/ext/transport/chttp2/transport/decode_huff.h +1008 -1486
  97. data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -0
  98. data/src/core/ext/transport/chttp2/transport/flow_control.h +23 -17
  99. data/src/core/ext/transport/chttp2/transport/frame.cc +99 -6
  100. data/src/core/ext/transport/chttp2/transport/frame.h +40 -2
  101. data/src/core/ext/transport/chttp2/transport/frame_data.cc +1 -1
  102. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +7 -8
  103. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -5
  104. data/src/core/ext/transport/chttp2/transport/header_assembler.h +290 -0
  105. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +1 -1
  106. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +4 -1
  107. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +11 -5
  108. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +12 -1
  109. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +1233 -0
  110. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +712 -0
  111. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +11 -38
  112. data/src/core/ext/transport/chttp2/transport/http2_settings.h +65 -51
  113. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +61 -0
  114. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +142 -0
  115. data/{third_party/abseil-cpp/absl/strings/cord_buffer.cc → src/core/ext/transport/chttp2/transport/http2_stats_collector.cc} +14 -14
  116. data/src/core/ext/transport/chttp2/transport/http2_stats_collector.h +33 -0
  117. data/src/core/ext/transport/chttp2/transport/http2_status.h +6 -1
  118. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +121 -0
  119. data/src/core/ext/transport/chttp2/transport/http2_transport.h +76 -0
  120. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +0 -29
  121. data/src/core/ext/transport/chttp2/transport/internal.h +18 -8
  122. data/src/core/ext/transport/chttp2/transport/keepalive.cc +105 -0
  123. data/src/core/ext/transport/chttp2/transport/keepalive.h +138 -0
  124. data/src/core/ext/transport/chttp2/transport/message_assembler.h +185 -0
  125. data/src/core/ext/transport/chttp2/transport/parsing.cc +4 -5
  126. data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +19 -0
  127. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +152 -0
  128. data/src/core/ext/transport/chttp2/transport/ping_promise.h +197 -0
  129. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +5 -9
  130. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.h +11 -0
  131. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +607 -0
  132. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +39 -1
  133. data/src/core/ext/transport/chttp2/transport/transport_common.cc +19 -0
  134. data/src/core/ext/transport/chttp2/transport/transport_common.h +27 -0
  135. data/src/core/ext/transport/chttp2/transport/writable_streams.h +254 -0
  136. data/src/core/ext/transport/chttp2/transport/writing.cc +41 -13
  137. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb.h +4959 -0
  138. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb_minitable.c +1111 -0
  139. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb_minitable.h +108 -0
  140. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb.h +571 -0
  141. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.c +120 -0
  142. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.h +36 -0
  143. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb.h +1272 -0
  144. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.c +312 -0
  145. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.h +50 -0
  146. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb.h +1072 -0
  147. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.c +230 -0
  148. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.h +44 -0
  149. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.c +716 -0
  150. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.h +227 -0
  151. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.c +175 -0
  152. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.h +82 -0
  153. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.c +133 -0
  154. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.h +67 -0
  155. data/src/core/filter/auth/auth_filters.h +2 -27
  156. data/src/core/filter/auth/client_auth_filter.cc +0 -118
  157. data/src/core/filter/filter_args.h +9 -23
  158. data/src/core/filter/fused_filters.cc +154 -0
  159. data/src/core/handshaker/handshaker.cc +23 -14
  160. data/src/core/handshaker/handshaker.h +3 -0
  161. data/src/core/handshaker/http_connect/http_connect_handshaker.cc +3 -1
  162. data/src/core/handshaker/security/legacy_secure_endpoint.cc +7 -6
  163. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +965 -0
  164. data/src/core/handshaker/security/secure_endpoint.cc +98 -38
  165. data/src/core/handshaker/security/secure_endpoint.h +8 -0
  166. data/src/core/handshaker/security/security_handshaker.cc +4 -1
  167. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +7 -1
  168. data/src/core/lib/channel/channel_args.cc +15 -0
  169. data/src/core/lib/channel/channel_args.h +3 -0
  170. data/src/core/lib/channel/channel_stack.cc +22 -23
  171. data/src/core/lib/channel/channel_stack.h +9 -7
  172. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -1
  173. data/src/core/lib/channel/channel_stack_builder_impl.h +2 -7
  174. data/src/core/lib/channel/promise_based_filter.cc +15 -25
  175. data/src/core/lib/channel/promise_based_filter.h +11 -10
  176. data/src/core/lib/debug/trace_impl.h +0 -1
  177. data/src/core/lib/event_engine/ares_resolver.cc +165 -46
  178. data/src/core/lib/event_engine/ares_resolver.h +51 -3
  179. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +12 -6
  180. data/src/core/lib/event_engine/cf_engine/cf_engine.h +2 -4
  181. data/src/core/lib/event_engine/cf_engine/cfsocket_listener.cc +263 -0
  182. data/src/core/lib/event_engine/cf_engine/cfsocket_listener.h +107 -0
  183. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +31 -3
  184. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +14 -6
  185. data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.cc +40 -0
  186. data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.h +60 -0
  187. data/src/core/lib/event_engine/event_engine.cc +7 -0
  188. data/src/core/lib/event_engine/extensions/channelz.h +10 -6
  189. data/src/core/lib/event_engine/grpc_polled_fd.h +5 -0
  190. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +139 -169
  191. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +17 -19
  192. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +90 -131
  193. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +13 -13
  194. data/src/core/lib/event_engine/posix_engine/event_poller.h +18 -23
  195. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +11 -23
  196. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.h +3 -2
  197. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.cc +124 -0
  198. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.h +243 -0
  199. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +30 -19
  200. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +6 -2
  201. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +6 -1
  202. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +4 -4
  203. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +3 -4
  204. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +147 -94
  205. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +9 -19
  206. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +435 -229
  207. data/src/core/lib/event_engine/posix_engine/posix_engine.h +78 -50
  208. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +46 -38
  209. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +6 -4
  210. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +32 -142
  211. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +6 -5
  212. data/src/core/lib/event_engine/posix_engine/posix_interface.h +211 -0
  213. data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +1083 -0
  214. data/src/core/lib/event_engine/posix_engine/posix_interface_windows.cc +281 -0
  215. data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.cc +154 -0
  216. data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.h +174 -0
  217. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +3 -719
  218. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +11 -171
  219. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +33 -22
  220. data/src/core/lib/event_engine/posix_engine/timer_manager.h +13 -11
  221. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +117 -151
  222. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +26 -94
  223. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +26 -25
  224. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +6 -2
  225. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +36 -62
  226. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +6 -2
  227. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +7 -6
  228. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +12 -6
  229. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +3 -1
  230. data/src/core/lib/event_engine/shim.cc +9 -0
  231. data/src/core/lib/event_engine/shim.h +3 -0
  232. data/src/core/lib/event_engine/thread_pool/thread_pool.h +7 -3
  233. data/src/core/lib/event_engine/thread_pool/thread_pool_factory.cc +0 -17
  234. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +4 -2
  235. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -2
  236. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +6 -1
  237. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.h +4 -0
  238. data/src/core/lib/event_engine/windows/windows_endpoint.h +2 -6
  239. data/src/core/lib/event_engine/windows/windows_engine.cc +0 -1
  240. data/src/core/lib/event_engine/windows/windows_engine.h +1 -3
  241. data/src/core/lib/event_engine/windows/windows_listener.cc +14 -2
  242. data/src/core/lib/experiments/experiments.cc +165 -99
  243. data/src/core/lib/experiments/experiments.h +65 -52
  244. data/src/core/lib/iomgr/combiner.cc +1 -1
  245. data/src/core/lib/iomgr/endpoint.cc +4 -3
  246. data/src/core/lib/iomgr/endpoint.h +7 -4
  247. data/src/core/lib/iomgr/endpoint_cfstream.cc +3 -2
  248. data/src/core/lib/iomgr/ev_epoll1_linux.cc +7 -2
  249. data/src/core/lib/iomgr/ev_poll_posix.cc +7 -2
  250. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +4 -6
  251. data/src/core/lib/iomgr/exec_ctx.h +3 -9
  252. data/src/core/lib/iomgr/socket_mutator.cc +1 -1
  253. data/src/core/lib/iomgr/socket_utils_posix.cc +1 -1
  254. data/src/core/lib/iomgr/socket_utils_posix.h +1 -1
  255. data/src/core/lib/iomgr/tcp_client_posix.cc +1 -1
  256. data/src/core/lib/iomgr/tcp_posix.cc +15 -9
  257. data/src/core/lib/iomgr/tcp_windows.cc +3 -2
  258. data/src/core/lib/promise/activity.h +3 -2
  259. data/src/core/lib/promise/arena_promise.h +23 -7
  260. data/src/core/lib/promise/detail/promise_factory.h +10 -0
  261. data/src/core/lib/promise/detail/promise_like.h +118 -11
  262. data/src/core/lib/promise/detail/promise_variant.h +50 -0
  263. data/src/core/lib/promise/detail/seq_state.h +687 -548
  264. data/src/core/lib/promise/if.h +20 -0
  265. data/src/core/lib/promise/inter_activity_latch.h +147 -0
  266. data/src/core/lib/promise/inter_activity_mutex.h +547 -0
  267. data/src/core/lib/promise/loop.h +65 -3
  268. data/src/core/lib/promise/map.h +24 -0
  269. data/src/core/lib/promise/match_promise.h +103 -0
  270. data/src/core/lib/promise/mpsc.cc +425 -0
  271. data/src/core/lib/promise/mpsc.h +490 -0
  272. data/src/core/lib/promise/party.cc +55 -6
  273. data/src/core/lib/promise/party.h +68 -3
  274. data/src/core/lib/promise/poll.h +10 -0
  275. data/src/core/lib/promise/race.h +31 -0
  276. data/src/core/lib/promise/seq.h +4 -1
  277. data/src/core/lib/promise/status_flag.h +7 -0
  278. data/src/core/lib/promise/try_seq.h +4 -1
  279. data/src/core/lib/promise/wait_set.cc +28 -0
  280. data/src/core/lib/promise/wait_set.h +86 -0
  281. data/src/core/lib/resource_quota/arena.h +19 -0
  282. data/src/core/lib/resource_quota/memory_quota.cc +90 -3
  283. data/src/core/lib/resource_quota/memory_quota.h +20 -9
  284. data/src/core/lib/resource_quota/periodic_update.cc +14 -0
  285. data/src/core/lib/resource_quota/periodic_update.h +8 -0
  286. data/src/core/lib/resource_quota/resource_quota.cc +15 -4
  287. data/src/core/lib/resource_quota/resource_quota.h +3 -0
  288. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +1 -2
  289. data/src/core/lib/slice/slice.h +5 -0
  290. data/src/core/lib/surface/call.cc +5 -5
  291. data/src/core/lib/surface/call.h +6 -5
  292. data/src/core/lib/surface/channel_create.cc +88 -13
  293. data/src/core/lib/surface/channel_create.h +4 -0
  294. data/src/core/lib/surface/channel_init.cc +164 -47
  295. data/src/core/lib/surface/channel_init.h +64 -1
  296. data/src/core/lib/surface/completion_queue.cc +2 -4
  297. data/src/core/lib/surface/filter_stack_call.cc +19 -10
  298. data/src/core/lib/surface/init.cc +6 -15
  299. data/src/core/lib/surface/legacy_channel.cc +3 -5
  300. data/src/core/lib/surface/legacy_channel.h +3 -1
  301. data/src/core/lib/surface/version.cc +2 -2
  302. data/src/core/lib/transport/promise_endpoint.cc +110 -0
  303. data/src/core/lib/transport/promise_endpoint.h +307 -0
  304. data/src/core/load_balancing/child_policy_handler.cc +2 -4
  305. data/src/core/load_balancing/delegating_helper.h +2 -3
  306. data/src/core/load_balancing/endpoint_list.cc +29 -2
  307. data/src/core/load_balancing/grpclb/client_load_reporting_filter.cc +3 -3
  308. data/src/core/load_balancing/grpclb/client_load_reporting_filter.h +1 -1
  309. data/src/core/load_balancing/health_check_client.cc +1 -5
  310. data/src/core/load_balancing/lb_policy.h +1 -3
  311. data/src/core/load_balancing/oob_backend_metric.cc +1 -5
  312. data/src/core/load_balancing/pick_first/pick_first.cc +15 -5
  313. data/src/core/load_balancing/xds/cds.cc +10 -1
  314. data/src/core/load_balancing/xds/xds_cluster_impl.cc +5 -3
  315. data/src/core/net/socket_mutator.cc +19 -0
  316. data/src/core/net/socket_mutator.h +25 -0
  317. data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -0
  318. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -0
  319. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver.h +6 -1
  320. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +2 -1
  321. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +8 -5
  322. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +2 -1
  323. data/src/core/resolver/xds/xds_config.cc +6 -3
  324. data/src/core/resolver/xds/xds_config.h +9 -4
  325. data/src/core/resolver/xds/xds_dependency_manager.cc +22 -7
  326. data/src/core/resolver/xds/xds_dependency_manager.h +2 -1
  327. data/src/core/resolver/xds/xds_resolver.cc +31 -11
  328. data/src/core/server/server.cc +84 -13
  329. data/src/core/server/server.h +21 -2
  330. data/src/core/server/server_call_tracer_filter.cc +0 -66
  331. data/src/core/server/server_call_tracer_filter.h +64 -0
  332. data/src/core/server/server_config_selector_filter.cc +1 -1
  333. data/src/core/server/xds_server_config_fetcher.cc +63 -25
  334. data/src/core/service_config/service_config.h +1 -1
  335. data/src/core/service_config/service_config_channel_arg_filter.cc +3 -60
  336. data/src/core/service_config/service_config_channel_arg_filter.h +82 -0
  337. data/src/core/service_config/service_config_impl.h +1 -1
  338. data/src/core/telemetry/call_tracer.cc +20 -14
  339. data/src/core/telemetry/call_tracer.h +22 -17
  340. data/src/core/telemetry/context_list_entry.cc +38 -0
  341. data/src/core/telemetry/context_list_entry.h +42 -12
  342. data/src/core/telemetry/metrics.h +8 -8
  343. data/src/core/telemetry/stats_data.cc +369 -343
  344. data/src/core/telemetry/stats_data.h +341 -244
  345. data/src/core/telemetry/tcp_tracer.h +1 -1
  346. data/src/core/transport/auth_context.cc +20 -0
  347. data/src/core/transport/auth_context.h +4 -0
  348. data/src/core/transport/auth_context_comparator_registry.h +69 -0
  349. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +2 -3
  350. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +11 -3
  351. data/src/core/tsi/fake_transport_security.cc +17 -0
  352. data/src/core/tsi/ssl_transport_security.cc +205 -32
  353. data/src/core/tsi/ssl_transport_security.h +19 -10
  354. data/src/core/tsi/ssl_transport_security_utils.cc +21 -0
  355. data/src/core/tsi/ssl_transport_security_utils.h +4 -0
  356. data/src/core/tsi/transport_security_grpc.cc +8 -0
  357. data/src/core/tsi/transport_security_grpc.h +15 -0
  358. data/src/core/util/backoff.cc +1 -5
  359. data/src/core/util/backoff.h +1 -0
  360. data/src/core/util/down_cast.h +1 -1
  361. data/src/core/util/function_signature.h +15 -1
  362. data/src/core/util/http_client/httpcli.cc +12 -5
  363. data/src/core/util/http_client/httpcli.h +4 -1
  364. data/src/core/util/http_client/httpcli_security_connector.cc +3 -1
  365. data/src/core/util/latent_see.cc +178 -146
  366. data/src/core/util/latent_see.h +249 -189
  367. data/src/core/util/log.cc +4 -0
  368. data/src/core/util/memory_usage.h +268 -0
  369. data/src/core/util/per_cpu.cc +2 -0
  370. data/src/core/util/per_cpu.h +7 -0
  371. data/src/core/util/shared_bit_gen.h +20 -0
  372. data/src/core/util/single_set_ptr.h +7 -4
  373. data/src/core/util/upb_utils.h +42 -0
  374. data/src/core/util/uri.cc +3 -2
  375. data/src/core/util/useful.h +144 -2
  376. data/src/core/util/wait_for_single_owner.cc +31 -0
  377. data/src/core/util/wait_for_single_owner.h +24 -0
  378. data/src/core/util/windows/directory_reader.cc +1 -0
  379. data/src/core/util/windows/thd.cc +1 -3
  380. data/src/core/util/work_serializer.cc +1 -1
  381. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +32 -5
  382. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.h +5 -0
  383. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +2 -0
  384. data/src/core/xds/grpc/xds_bootstrap_grpc.h +5 -0
  385. data/src/core/xds/grpc/xds_certificate_provider.cc +5 -6
  386. data/src/core/xds/grpc/xds_client_grpc.cc +6 -2
  387. data/src/core/xds/grpc/xds_common_types_parser.cc +138 -50
  388. data/src/core/xds/grpc/xds_common_types_parser.h +12 -0
  389. data/src/core/xds/grpc/xds_http_filter.h +7 -0
  390. data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +22 -0
  391. data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +3 -0
  392. data/src/core/xds/grpc/xds_route_config_parser.cc +15 -38
  393. data/src/core/xds/grpc/xds_server_grpc.cc +63 -13
  394. data/src/core/xds/grpc/xds_server_grpc.h +10 -2
  395. data/src/core/xds/grpc/xds_server_grpc_interface.h +4 -0
  396. data/src/core/xds/grpc/xds_transport_grpc.cc +18 -0
  397. data/src/core/xds/xds_client/xds_bootstrap.h +2 -0
  398. data/src/core/xds/xds_client/xds_client.cc +26 -5
  399. data/src/ruby/ext/grpc/extconf.rb +2 -0
  400. data/src/ruby/ext/grpc/rb_call.c +1 -8
  401. data/src/ruby/ext/grpc/rb_channel.c +70 -557
  402. data/src/ruby/ext/grpc/rb_channel.h +0 -3
  403. data/src/ruby/ext/grpc/rb_completion_queue.c +26 -14
  404. data/src/ruby/ext/grpc/rb_completion_queue.h +1 -7
  405. data/src/ruby/ext/grpc/rb_grpc.c +9 -5
  406. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +2 -2
  407. data/src/ruby/ext/grpc/rb_loader.c +0 -4
  408. data/src/ruby/ext/grpc/rb_server.c +31 -50
  409. data/src/ruby/lib/grpc/generic/client_stub.rb +4 -4
  410. data/src/ruby/lib/grpc/version.rb +1 -1
  411. data/src/ruby/spec/core_spec.rb +22 -0
  412. data/src/ruby/spec/generic/active_call_spec.rb +1 -1
  413. data/third_party/abseil-cpp/absl/algorithm/container.h +2 -19
  414. data/third_party/abseil-cpp/absl/base/attributes.h +76 -7
  415. data/third_party/abseil-cpp/absl/base/call_once.h +11 -12
  416. data/third_party/abseil-cpp/absl/base/config.h +20 -129
  417. data/third_party/abseil-cpp/absl/base/{internal/fast_type_id.h → fast_type_id.h} +11 -16
  418. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +0 -5
  419. data/third_party/abseil-cpp/absl/base/internal/cycleclock_config.h +7 -7
  420. data/third_party/abseil-cpp/absl/base/internal/endian.h +34 -38
  421. data/third_party/abseil-cpp/absl/base/internal/iterator_traits.h +71 -0
  422. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +6 -5
  423. data/third_party/abseil-cpp/absl/base/internal/{nullability_impl.h → nullability_deprecated.h} +45 -8
  424. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +0 -9
  425. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +3 -13
  426. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +6 -6
  427. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +8 -3
  428. data/third_party/abseil-cpp/absl/base/no_destructor.h +11 -32
  429. data/third_party/abseil-cpp/absl/base/nullability.h +84 -72
  430. data/third_party/abseil-cpp/absl/base/options.h +3 -80
  431. data/third_party/abseil-cpp/absl/base/policy_checks.h +7 -7
  432. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +1 -3
  433. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -4
  434. data/third_party/abseil-cpp/absl/container/btree_map.h +4 -2
  435. data/third_party/abseil-cpp/absl/container/btree_set.h +4 -2
  436. data/third_party/abseil-cpp/absl/container/fixed_array.h +7 -14
  437. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +5 -0
  438. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +6 -1
  439. data/third_party/abseil-cpp/absl/container/inlined_vector.h +8 -5
  440. data/third_party/abseil-cpp/absl/container/internal/btree.h +132 -29
  441. data/third_party/abseil-cpp/absl/container/internal/btree_container.h +175 -71
  442. data/third_party/abseil-cpp/absl/container/internal/common.h +43 -0
  443. data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -2
  444. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +9 -10
  445. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +1 -8
  446. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +0 -4
  447. data/third_party/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +527 -0
  448. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +20 -4
  449. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +31 -12
  450. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +2 -7
  451. data/third_party/abseil-cpp/absl/container/internal/layout.h +26 -42
  452. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +199 -68
  453. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +1354 -183
  454. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +881 -1424
  455. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +80 -0
  456. data/third_party/abseil-cpp/absl/crc/crc32c.cc +0 -4
  457. data/third_party/abseil-cpp/absl/crc/crc32c.h +7 -5
  458. data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +0 -22
  459. data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +45 -74
  460. data/third_party/abseil-cpp/absl/debugging/internal/addresses.h +57 -0
  461. data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.cc +1 -1
  462. data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.h +5 -5
  463. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +8 -35
  464. data/third_party/abseil-cpp/absl/debugging/internal/demangle_rust.cc +16 -16
  465. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +40 -37
  466. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +16 -7
  467. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +14 -5
  468. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +10 -4
  469. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +27 -16
  470. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +13 -4
  471. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +4 -3
  472. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +15 -28
  473. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +19 -9
  474. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +144 -27
  475. data/third_party/abseil-cpp/absl/debugging/stacktrace.h +73 -5
  476. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +19 -9
  477. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +3 -2
  478. data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +25 -6
  479. data/third_party/abseil-cpp/absl/flags/commandlineflag.h +2 -2
  480. data/third_party/abseil-cpp/absl/flags/flag.h +4 -3
  481. data/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h +2 -2
  482. data/third_party/abseil-cpp/absl/flags/internal/flag.cc +2 -1
  483. data/third_party/abseil-cpp/absl/flags/internal/flag.h +7 -6
  484. data/third_party/abseil-cpp/absl/flags/internal/registry.h +4 -3
  485. data/third_party/abseil-cpp/absl/flags/reflection.cc +2 -3
  486. data/third_party/abseil-cpp/absl/functional/any_invocable.h +8 -10
  487. data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -9
  488. data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +110 -226
  489. data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +10 -12
  490. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +2 -5
  491. data/third_party/abseil-cpp/absl/hash/hash.h +18 -0
  492. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +1 -5
  493. data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -61
  494. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +25 -68
  495. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.h +2 -6
  496. data/third_party/abseil-cpp/absl/hash/internal/weakly_mixed_integer.h +38 -0
  497. data/third_party/abseil-cpp/absl/log/check.h +2 -1
  498. data/third_party/abseil-cpp/absl/log/globals.h +4 -5
  499. data/third_party/abseil-cpp/absl/log/internal/append_truncated.h +28 -0
  500. data/third_party/abseil-cpp/absl/log/internal/check_op.cc +22 -22
  501. data/third_party/abseil-cpp/absl/log/internal/check_op.h +65 -62
  502. data/third_party/abseil-cpp/absl/log/internal/conditions.cc +5 -3
  503. data/third_party/abseil-cpp/absl/log/internal/conditions.h +7 -2
  504. data/third_party/abseil-cpp/absl/log/internal/log_message.cc +85 -43
  505. data/third_party/abseil-cpp/absl/log/internal/log_message.h +84 -59
  506. data/third_party/abseil-cpp/absl/log/internal/nullstream.h +1 -0
  507. data/third_party/abseil-cpp/absl/log/internal/proto.cc +3 -2
  508. data/third_party/abseil-cpp/absl/log/internal/proto.h +3 -3
  509. data/third_party/abseil-cpp/absl/log/internal/strip.h +4 -12
  510. data/third_party/abseil-cpp/absl/log/internal/vlog_config.h +8 -6
  511. data/third_party/abseil-cpp/absl/log/internal/voidify.h +10 -4
  512. data/third_party/abseil-cpp/absl/log/log.h +48 -35
  513. data/third_party/abseil-cpp/absl/log/log_sink_registry.h +2 -2
  514. data/third_party/abseil-cpp/absl/meta/type_traits.h +46 -175
  515. data/third_party/abseil-cpp/absl/numeric/bits.h +68 -2
  516. data/third_party/abseil-cpp/absl/numeric/int128.cc +0 -52
  517. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +7 -3
  518. data/third_party/abseil-cpp/absl/profiling/internal/exponential_biased.cc +1 -1
  519. data/third_party/abseil-cpp/absl/random/bit_gen_ref.h +10 -11
  520. data/third_party/abseil-cpp/absl/random/distributions.h +6 -8
  521. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +1 -1
  522. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +5 -6
  523. data/third_party/abseil-cpp/absl/random/internal/{pool_urbg.cc → entropy_pool.cc} +22 -90
  524. data/third_party/abseil-cpp/absl/random/internal/entropy_pool.h +35 -0
  525. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +5 -6
  526. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +1 -1
  527. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +20 -12
  528. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +5 -5
  529. data/third_party/abseil-cpp/absl/random/random.h +88 -53
  530. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +6 -2
  531. data/third_party/abseil-cpp/absl/status/internal/status_internal.cc +3 -4
  532. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +3 -4
  533. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -3
  534. data/third_party/abseil-cpp/absl/status/status.cc +4 -8
  535. data/third_party/abseil-cpp/absl/status/status.h +8 -8
  536. data/third_party/abseil-cpp/absl/status/status_payload_printer.h +2 -2
  537. data/third_party/abseil-cpp/absl/status/statusor.cc +2 -2
  538. data/third_party/abseil-cpp/absl/status/statusor.h +6 -6
  539. data/third_party/abseil-cpp/absl/strings/ascii.cc +9 -9
  540. data/third_party/abseil-cpp/absl/strings/ascii.h +18 -18
  541. data/third_party/abseil-cpp/absl/strings/charconv.cc +21 -22
  542. data/third_party/abseil-cpp/absl/strings/charconv.h +5 -5
  543. data/third_party/abseil-cpp/absl/strings/cord.cc +54 -58
  544. data/third_party/abseil-cpp/absl/strings/cord.h +94 -83
  545. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +11 -11
  546. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +3 -3
  547. data/third_party/abseil-cpp/absl/strings/escaping.cc +130 -149
  548. data/third_party/abseil-cpp/absl/strings/escaping.h +9 -10
  549. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
  550. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +6 -8
  551. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +0 -4
  552. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +0 -4
  553. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +7 -63
  554. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -11
  555. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +0 -22
  556. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.cc +5 -3
  557. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
  558. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +3 -3
  559. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +0 -5
  560. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +96 -1
  561. data/third_party/abseil-cpp/absl/strings/internal/utf8.h +15 -1
  562. data/third_party/abseil-cpp/absl/strings/numbers.cc +53 -32
  563. data/third_party/abseil-cpp/absl/strings/numbers.h +87 -58
  564. data/third_party/abseil-cpp/absl/strings/str_cat.cc +6 -7
  565. data/third_party/abseil-cpp/absl/strings/str_cat.h +32 -32
  566. data/third_party/abseil-cpp/absl/strings/str_format.h +18 -18
  567. data/third_party/abseil-cpp/absl/strings/str_replace.cc +3 -3
  568. data/third_party/abseil-cpp/absl/strings/str_replace.h +6 -6
  569. data/third_party/abseil-cpp/absl/strings/string_view.cc +4 -9
  570. data/third_party/abseil-cpp/absl/strings/string_view.h +27 -32
  571. data/third_party/abseil-cpp/absl/strings/strip.h +4 -4
  572. data/third_party/abseil-cpp/absl/strings/substitute.cc +5 -4
  573. data/third_party/abseil-cpp/absl/strings/substitute.h +66 -64
  574. data/third_party/abseil-cpp/absl/synchronization/internal/futex_waiter.cc +0 -4
  575. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc +0 -5
  576. data/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc +0 -4
  577. data/third_party/abseil-cpp/absl/synchronization/internal/sem_waiter.cc +0 -4
  578. data/third_party/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.cc +0 -4
  579. data/third_party/abseil-cpp/absl/synchronization/internal/waiter_base.cc +0 -4
  580. data/third_party/abseil-cpp/absl/synchronization/internal/win32_waiter.cc +0 -4
  581. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +1 -1
  582. data/third_party/abseil-cpp/absl/synchronization/mutex.h +97 -69
  583. data/third_party/abseil-cpp/absl/synchronization/notification.h +1 -1
  584. data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -0
  585. data/third_party/abseil-cpp/absl/time/duration.cc +12 -7
  586. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +1 -1
  587. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +90 -111
  588. data/third_party/abseil-cpp/absl/time/time.h +20 -15
  589. data/third_party/abseil-cpp/absl/types/optional.h +7 -747
  590. data/third_party/abseil-cpp/absl/types/span.h +13 -11
  591. data/third_party/abseil-cpp/absl/types/variant.h +5 -784
  592. data/third_party/abseil-cpp/absl/utility/utility.h +10 -185
  593. data/third_party/cares/cares/include/ares.h +925 -460
  594. data/third_party/cares/cares/include/ares_dns.h +86 -71
  595. data/third_party/cares/cares/include/ares_dns_record.h +1118 -0
  596. data/third_party/cares/cares/include/ares_nameser.h +215 -189
  597. data/third_party/cares/cares/include/ares_version.h +37 -14
  598. data/third_party/cares/cares/src/lib/ares_addrinfo2hostent.c +305 -0
  599. data/third_party/cares/cares/src/lib/ares_addrinfo_localhost.c +245 -0
  600. data/third_party/cares/cares/src/lib/ares_android.c +216 -164
  601. data/third_party/cares/cares/src/lib/ares_android.h +25 -14
  602. data/third_party/cares/cares/src/lib/ares_cancel.c +68 -44
  603. data/third_party/cares/cares/src/lib/ares_close_sockets.c +137 -0
  604. data/third_party/cares/cares/src/lib/ares_conn.c +511 -0
  605. data/third_party/cares/cares/src/lib/ares_conn.h +196 -0
  606. data/third_party/cares/cares/src/lib/ares_cookie.c +461 -0
  607. data/third_party/cares/cares/src/lib/ares_data.c +93 -181
  608. data/third_party/cares/cares/src/lib/ares_data.h +50 -39
  609. data/third_party/cares/cares/src/lib/ares_destroy.c +127 -89
  610. data/third_party/cares/cares/src/lib/ares_free_hostent.c +35 -24
  611. data/third_party/cares/cares/src/lib/ares_free_string.c +24 -16
  612. data/third_party/cares/cares/src/lib/ares_freeaddrinfo.c +45 -38
  613. data/third_party/cares/cares/src/lib/ares_getaddrinfo.c +549 -663
  614. data/third_party/cares/cares/src/lib/ares_getenv.c +25 -15
  615. data/third_party/cares/cares/src/lib/ares_getenv.h +26 -18
  616. data/third_party/cares/cares/src/lib/ares_gethostbyaddr.c +163 -221
  617. data/third_party/cares/cares/src/lib/ares_gethostbyname.c +222 -223
  618. data/third_party/cares/cares/src/lib/ares_getnameinfo.c +328 -338
  619. data/third_party/cares/cares/src/lib/ares_hosts_file.c +952 -0
  620. data/third_party/cares/cares/src/lib/ares_inet_net_pton.h +25 -19
  621. data/third_party/cares/cares/src/lib/ares_init.c +425 -2091
  622. data/third_party/cares/cares/src/lib/ares_ipv6.h +63 -33
  623. data/third_party/cares/cares/src/lib/ares_library_init.c +110 -54
  624. data/third_party/cares/cares/src/lib/ares_metrics.c +261 -0
  625. data/third_party/cares/cares/src/lib/ares_options.c +418 -332
  626. data/third_party/cares/cares/src/lib/ares_parse_into_addrinfo.c +179 -0
  627. data/third_party/cares/cares/src/lib/ares_private.h +558 -356
  628. data/third_party/cares/cares/src/lib/ares_process.c +1224 -1369
  629. data/third_party/cares/cares/src/lib/ares_qcache.c +430 -0
  630. data/third_party/cares/cares/src/lib/ares_query.c +126 -121
  631. data/third_party/cares/cares/src/lib/ares_search.c +564 -262
  632. data/third_party/cares/cares/src/lib/ares_send.c +264 -93
  633. data/third_party/cares/cares/src/lib/ares_set_socket_functions.c +588 -0
  634. data/third_party/cares/cares/src/lib/ares_setup.h +115 -111
  635. data/third_party/cares/cares/src/lib/ares_socket.c +425 -0
  636. data/third_party/cares/cares/src/lib/ares_socket.h +163 -0
  637. data/third_party/cares/cares/src/lib/ares_sortaddrinfo.c +447 -0
  638. data/third_party/cares/cares/src/lib/ares_strerror.c +83 -48
  639. data/third_party/cares/cares/src/lib/ares_sysconfig.c +639 -0
  640. data/third_party/cares/cares/src/lib/ares_sysconfig_files.c +839 -0
  641. data/third_party/cares/cares/src/lib/ares_sysconfig_mac.c +373 -0
  642. data/third_party/cares/cares/src/lib/ares_sysconfig_win.c +621 -0
  643. data/third_party/cares/cares/src/lib/ares_timeout.c +136 -73
  644. data/third_party/cares/cares/src/lib/ares_update_servers.c +1362 -0
  645. data/third_party/cares/cares/src/lib/ares_version.c +29 -4
  646. data/third_party/cares/cares/src/lib/config-dos.h +88 -89
  647. data/third_party/cares/cares/src/lib/config-win32.h +122 -77
  648. data/third_party/cares/cares/src/lib/dsa/ares_array.c +394 -0
  649. data/third_party/cares/cares/src/lib/dsa/ares_htable.c +447 -0
  650. data/third_party/cares/cares/src/lib/dsa/ares_htable.h +174 -0
  651. data/third_party/cares/cares/src/lib/dsa/ares_htable_asvp.c +224 -0
  652. data/third_party/cares/cares/src/lib/dsa/ares_htable_dict.c +228 -0
  653. data/third_party/cares/cares/src/lib/dsa/ares_htable_strvp.c +210 -0
  654. data/third_party/cares/cares/src/lib/dsa/ares_htable_szvp.c +188 -0
  655. data/third_party/cares/cares/src/lib/dsa/ares_htable_vpstr.c +186 -0
  656. data/third_party/cares/cares/src/lib/dsa/ares_htable_vpvp.c +194 -0
  657. data/third_party/cares/cares/src/lib/dsa/ares_llist.c +382 -0
  658. data/third_party/cares/cares/src/lib/dsa/ares_slist.c +479 -0
  659. data/third_party/cares/cares/src/lib/dsa/ares_slist.h +207 -0
  660. data/third_party/cares/cares/src/lib/event/ares_event.h +191 -0
  661. data/third_party/cares/cares/src/lib/event/ares_event_configchg.c +743 -0
  662. data/third_party/cares/cares/src/lib/event/ares_event_epoll.c +192 -0
  663. data/third_party/cares/cares/src/lib/event/ares_event_kqueue.c +248 -0
  664. data/third_party/cares/cares/src/lib/event/ares_event_poll.c +140 -0
  665. data/third_party/cares/cares/src/lib/event/ares_event_select.c +159 -0
  666. data/third_party/cares/cares/src/lib/event/ares_event_thread.c +567 -0
  667. data/third_party/cares/cares/src/lib/event/ares_event_wake_pipe.c +166 -0
  668. data/third_party/cares/cares/src/lib/event/ares_event_win32.c +978 -0
  669. data/third_party/cares/cares/src/lib/event/ares_event_win32.h +161 -0
  670. data/third_party/cares/cares/src/lib/include/ares_array.h +276 -0
  671. data/third_party/cares/cares/src/lib/include/ares_buf.h +732 -0
  672. data/third_party/cares/cares/src/lib/include/ares_htable_asvp.h +130 -0
  673. data/third_party/cares/cares/src/lib/include/ares_htable_dict.h +123 -0
  674. data/third_party/cares/cares/src/lib/include/ares_htable_strvp.h +130 -0
  675. data/third_party/cares/cares/src/lib/include/ares_htable_szvp.h +118 -0
  676. data/third_party/cares/cares/src/lib/include/ares_htable_vpstr.h +111 -0
  677. data/third_party/cares/cares/src/lib/include/ares_htable_vpvp.h +128 -0
  678. data/third_party/cares/cares/src/lib/include/ares_llist.h +239 -0
  679. data/third_party/cares/cares/src/lib/include/ares_mem.h +38 -0
  680. data/third_party/cares/cares/src/lib/include/ares_str.h +244 -0
  681. data/third_party/cares/cares/src/lib/inet_net_pton.c +202 -157
  682. data/third_party/cares/cares/src/lib/inet_ntop.c +87 -69
  683. data/third_party/cares/cares/src/lib/legacy/ares_create_query.c +78 -0
  684. data/third_party/cares/cares/src/lib/legacy/ares_expand_name.c +99 -0
  685. data/third_party/cares/cares/src/lib/legacy/ares_expand_string.c +107 -0
  686. data/third_party/cares/cares/src/lib/legacy/ares_fds.c +80 -0
  687. data/third_party/cares/cares/src/lib/legacy/ares_getsock.c +85 -0
  688. data/third_party/cares/cares/src/lib/legacy/ares_parse_a_reply.c +107 -0
  689. data/third_party/cares/cares/src/lib/legacy/ares_parse_aaaa_reply.c +109 -0
  690. data/third_party/cares/cares/src/lib/legacy/ares_parse_caa_reply.c +137 -0
  691. data/third_party/cares/cares/src/lib/legacy/ares_parse_mx_reply.c +110 -0
  692. data/third_party/cares/cares/src/lib/legacy/ares_parse_naptr_reply.c +132 -0
  693. data/third_party/cares/cares/src/lib/legacy/ares_parse_ns_reply.c +154 -0
  694. data/third_party/cares/cares/src/lib/legacy/ares_parse_ptr_reply.c +213 -0
  695. data/third_party/cares/cares/src/lib/legacy/ares_parse_soa_reply.c +115 -0
  696. data/third_party/cares/cares/src/lib/legacy/ares_parse_srv_reply.c +114 -0
  697. data/third_party/cares/cares/src/lib/legacy/ares_parse_txt_reply.c +144 -0
  698. data/third_party/cares/cares/src/lib/legacy/ares_parse_uri_reply.c +113 -0
  699. data/third_party/cares/cares/src/lib/record/ares_dns_mapping.c +982 -0
  700. data/third_party/cares/cares/src/lib/record/ares_dns_multistring.c +307 -0
  701. data/third_party/cares/cares/src/lib/record/ares_dns_multistring.h +72 -0
  702. data/third_party/cares/cares/src/lib/record/ares_dns_name.c +673 -0
  703. data/third_party/cares/cares/src/lib/record/ares_dns_parse.c +1329 -0
  704. data/third_party/cares/cares/src/lib/record/ares_dns_private.h +273 -0
  705. data/third_party/cares/cares/src/lib/record/ares_dns_record.c +1661 -0
  706. data/third_party/cares/cares/src/lib/record/ares_dns_write.c +1229 -0
  707. data/third_party/cares/cares/src/lib/str/ares_buf.c +1498 -0
  708. data/third_party/cares/cares/src/lib/str/ares_str.c +508 -0
  709. data/third_party/cares/cares/src/lib/str/ares_strsplit.c +90 -0
  710. data/third_party/cares/cares/src/lib/str/ares_strsplit.h +51 -0
  711. data/third_party/cares/cares/src/lib/thirdparty/apple/dnsinfo.h +122 -0
  712. data/third_party/cares/cares/src/lib/util/ares_iface_ips.c +628 -0
  713. data/third_party/cares/cares/src/lib/util/ares_iface_ips.h +139 -0
  714. data/third_party/cares/cares/src/lib/util/ares_math.c +158 -0
  715. data/third_party/cares/cares/src/lib/util/ares_math.h +45 -0
  716. data/third_party/cares/cares/src/lib/util/ares_rand.c +389 -0
  717. data/third_party/cares/cares/src/lib/util/ares_rand.h +36 -0
  718. data/third_party/cares/cares/src/lib/util/ares_threads.c +614 -0
  719. data/third_party/cares/cares/src/lib/util/ares_threads.h +60 -0
  720. data/third_party/cares/cares/src/lib/util/ares_time.h +48 -0
  721. data/third_party/cares/cares/src/lib/util/ares_timeval.c +95 -0
  722. data/third_party/cares/cares/src/lib/util/ares_uri.c +1626 -0
  723. data/third_party/cares/cares/src/lib/util/ares_uri.h +252 -0
  724. data/third_party/cares/cares/src/lib/windows_port.c +16 -9
  725. metadata +192 -68
  726. data/src/core/lib/event_engine/forkable.cc +0 -105
  727. data/src/core/lib/event_engine/forkable.h +0 -67
  728. data/src/core/lib/iomgr/python_util.h +0 -46
  729. data/src/core/util/ring_buffer.h +0 -122
  730. data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +0 -108
  731. data/third_party/abseil-cpp/absl/base/internal/invoke.h +0 -241
  732. data/third_party/abseil-cpp/absl/log/log_entry.cc +0 -41
  733. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +0 -131
  734. data/third_party/abseil-cpp/absl/types/bad_optional_access.cc +0 -66
  735. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +0 -78
  736. data/third_party/abseil-cpp/absl/types/bad_variant_access.cc +0 -82
  737. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +0 -82
  738. data/third_party/abseil-cpp/absl/types/internal/optional.h +0 -352
  739. data/third_party/abseil-cpp/absl/types/internal/variant.h +0 -1622
  740. data/third_party/cares/cares/include/ares_rules.h +0 -125
  741. data/third_party/cares/cares/src/lib/ares__addrinfo2hostent.c +0 -266
  742. data/third_party/cares/cares/src/lib/ares__addrinfo_localhost.c +0 -240
  743. data/third_party/cares/cares/src/lib/ares__close_sockets.c +0 -61
  744. data/third_party/cares/cares/src/lib/ares__get_hostent.c +0 -260
  745. data/third_party/cares/cares/src/lib/ares__parse_into_addrinfo.c +0 -229
  746. data/third_party/cares/cares/src/lib/ares__read_line.c +0 -73
  747. data/third_party/cares/cares/src/lib/ares__readaddrinfo.c +0 -258
  748. data/third_party/cares/cares/src/lib/ares__sortaddrinfo.c +0 -507
  749. data/third_party/cares/cares/src/lib/ares__timeval.c +0 -111
  750. data/third_party/cares/cares/src/lib/ares_create_query.c +0 -197
  751. data/third_party/cares/cares/src/lib/ares_expand_name.c +0 -311
  752. data/third_party/cares/cares/src/lib/ares_expand_string.c +0 -67
  753. data/third_party/cares/cares/src/lib/ares_fds.c +0 -59
  754. data/third_party/cares/cares/src/lib/ares_getsock.c +0 -66
  755. data/third_party/cares/cares/src/lib/ares_iphlpapi.h +0 -221
  756. data/third_party/cares/cares/src/lib/ares_llist.c +0 -63
  757. data/third_party/cares/cares/src/lib/ares_llist.h +0 -39
  758. data/third_party/cares/cares/src/lib/ares_mkquery.c +0 -24
  759. data/third_party/cares/cares/src/lib/ares_nowarn.c +0 -260
  760. data/third_party/cares/cares/src/lib/ares_nowarn.h +0 -61
  761. data/third_party/cares/cares/src/lib/ares_parse_a_reply.c +0 -90
  762. data/third_party/cares/cares/src/lib/ares_parse_aaaa_reply.c +0 -92
  763. data/third_party/cares/cares/src/lib/ares_parse_caa_reply.c +0 -199
  764. data/third_party/cares/cares/src/lib/ares_parse_mx_reply.c +0 -164
  765. data/third_party/cares/cares/src/lib/ares_parse_naptr_reply.c +0 -183
  766. data/third_party/cares/cares/src/lib/ares_parse_ns_reply.c +0 -177
  767. data/third_party/cares/cares/src/lib/ares_parse_ptr_reply.c +0 -228
  768. data/third_party/cares/cares/src/lib/ares_parse_soa_reply.c +0 -179
  769. data/third_party/cares/cares/src/lib/ares_parse_srv_reply.c +0 -168
  770. data/third_party/cares/cares/src/lib/ares_parse_txt_reply.c +0 -214
  771. data/third_party/cares/cares/src/lib/ares_parse_uri_reply.c +0 -184
  772. data/third_party/cares/cares/src/lib/ares_platform.c +0 -11042
  773. data/third_party/cares/cares/src/lib/ares_platform.h +0 -43
  774. data/third_party/cares/cares/src/lib/ares_rand.c +0 -279
  775. data/third_party/cares/cares/src/lib/ares_strcasecmp.c +0 -66
  776. data/third_party/cares/cares/src/lib/ares_strcasecmp.h +0 -30
  777. data/third_party/cares/cares/src/lib/ares_strdup.c +0 -42
  778. data/third_party/cares/cares/src/lib/ares_strdup.h +0 -24
  779. data/third_party/cares/cares/src/lib/ares_strsplit.c +0 -94
  780. data/third_party/cares/cares/src/lib/ares_strsplit.h +0 -42
  781. data/third_party/cares/cares/src/lib/ares_writev.c +0 -79
  782. data/third_party/cares/cares/src/lib/ares_writev.h +0 -36
  783. data/third_party/cares/cares/src/lib/bitncmp.c +0 -59
  784. data/third_party/cares/cares/src/lib/bitncmp.h +0 -26
  785. data/third_party/cares/cares/src/lib/setup_once.h +0 -554
  786. data/third_party/cares/cares/src/tools/ares_getopt.h +0 -53
@@ -0,0 +1,1329 @@
1
+ /* MIT License
2
+ *
3
+ * Copyright (c) 2023 Brad House
4
+ *
5
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ * of this software and associated documentation files (the "Software"), to deal
7
+ * in the Software without restriction, including without limitation the rights
8
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ * copies of the Software, and to permit persons to whom the Software is
10
+ * furnished to do so, subject to the following conditions:
11
+ *
12
+ * The above copyright notice and this permission notice (including the next
13
+ * paragraph) shall be included in all copies or substantial portions of the
14
+ * Software.
15
+ *
16
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ * SOFTWARE.
23
+ *
24
+ * SPDX-License-Identifier: MIT
25
+ */
26
+ #include "ares_private.h"
27
+ #include <limits.h>
28
+ #ifdef HAVE_STDINT_H
29
+ # include <stdint.h>
30
+ #endif
31
+
32
+ static size_t ares_dns_rr_remaining_len(const ares_buf_t *buf, size_t orig_len,
33
+ size_t rdlength)
34
+ {
35
+ size_t used_len = orig_len - ares_buf_len(buf);
36
+ if (used_len >= rdlength) {
37
+ return 0;
38
+ }
39
+ return rdlength - used_len;
40
+ }
41
+
42
+ static ares_status_t ares_dns_parse_and_set_dns_name(ares_buf_t *buf,
43
+ ares_bool_t is_hostname,
44
+ ares_dns_rr_t *rr,
45
+ ares_dns_rr_key_t key)
46
+ {
47
+ ares_status_t status;
48
+ char *name = NULL;
49
+
50
+ status = ares_dns_name_parse(buf, &name, is_hostname);
51
+ if (status != ARES_SUCCESS) {
52
+ return status;
53
+ }
54
+
55
+ status = ares_dns_rr_set_str_own(rr, key, name);
56
+ if (status != ARES_SUCCESS) {
57
+ ares_free(name);
58
+ return status;
59
+ }
60
+ return ARES_SUCCESS;
61
+ }
62
+
63
+ static ares_status_t ares_dns_parse_and_set_dns_str(ares_buf_t *buf,
64
+ size_t max_len,
65
+ ares_dns_rr_t *rr,
66
+ ares_dns_rr_key_t key,
67
+ ares_bool_t blank_allowed)
68
+ {
69
+ ares_status_t status;
70
+ char *str = NULL;
71
+
72
+ status = ares_buf_parse_dns_str(buf, max_len, &str);
73
+ if (status != ARES_SUCCESS) {
74
+ return status;
75
+ }
76
+
77
+ if (!blank_allowed && ares_strlen(str) == 0) {
78
+ ares_free(str);
79
+ return ARES_EBADRESP;
80
+ }
81
+
82
+ status = ares_dns_rr_set_str_own(rr, key, str);
83
+ if (status != ARES_SUCCESS) {
84
+ ares_free(str);
85
+ return status;
86
+ }
87
+ return ARES_SUCCESS;
88
+ }
89
+
90
+ static ares_status_t
91
+ ares_dns_parse_and_set_dns_abin(ares_buf_t *buf, size_t max_len,
92
+ ares_dns_rr_t *rr, ares_dns_rr_key_t key,
93
+ ares_bool_t validate_printable)
94
+ {
95
+ ares_status_t status;
96
+ ares_dns_multistring_t *strs = NULL;
97
+
98
+ status =
99
+ ares_dns_multistring_parse_buf(buf, max_len, &strs, validate_printable);
100
+ if (status != ARES_SUCCESS) {
101
+ return status;
102
+ }
103
+
104
+ status = ares_dns_rr_set_abin_own(rr, key, strs);
105
+ if (status != ARES_SUCCESS) {
106
+ ares_dns_multistring_destroy(strs);
107
+ return status;
108
+ }
109
+ return ARES_SUCCESS;
110
+ }
111
+
112
+ static ares_status_t ares_dns_parse_and_set_be32(ares_buf_t *buf,
113
+ ares_dns_rr_t *rr,
114
+ ares_dns_rr_key_t key)
115
+ {
116
+ ares_status_t status;
117
+ unsigned int u32;
118
+
119
+ status = ares_buf_fetch_be32(buf, &u32);
120
+ if (status != ARES_SUCCESS) {
121
+ return status;
122
+ }
123
+
124
+ return ares_dns_rr_set_u32(rr, key, u32);
125
+ }
126
+
127
+ static ares_status_t ares_dns_parse_and_set_be16(ares_buf_t *buf,
128
+ ares_dns_rr_t *rr,
129
+ ares_dns_rr_key_t key)
130
+ {
131
+ ares_status_t status;
132
+ unsigned short u16;
133
+
134
+ status = ares_buf_fetch_be16(buf, &u16);
135
+ if (status != ARES_SUCCESS) {
136
+ return status;
137
+ }
138
+
139
+ return ares_dns_rr_set_u16(rr, key, u16);
140
+ }
141
+
142
+ static ares_status_t ares_dns_parse_and_set_u8(ares_buf_t *buf,
143
+ ares_dns_rr_t *rr,
144
+ ares_dns_rr_key_t key)
145
+ {
146
+ ares_status_t status;
147
+ unsigned char u8;
148
+
149
+ status = ares_buf_fetch_bytes(buf, &u8, 1);
150
+ if (status != ARES_SUCCESS) {
151
+ return status;
152
+ }
153
+
154
+ return ares_dns_rr_set_u8(rr, key, u8);
155
+ }
156
+
157
+ static ares_status_t ares_dns_parse_rr_a(ares_buf_t *buf, ares_dns_rr_t *rr,
158
+ size_t rdlength)
159
+ {
160
+ struct in_addr addr;
161
+ ares_status_t status;
162
+
163
+ (void)rdlength; /* Not needed */
164
+
165
+ status = ares_buf_fetch_bytes(buf, (unsigned char *)&addr, sizeof(addr));
166
+ if (status != ARES_SUCCESS) {
167
+ return status;
168
+ }
169
+
170
+ return ares_dns_rr_set_addr(rr, ARES_RR_A_ADDR, &addr);
171
+ }
172
+
173
+ static ares_status_t ares_dns_parse_rr_ns(ares_buf_t *buf, ares_dns_rr_t *rr,
174
+ size_t rdlength)
175
+ {
176
+ (void)rdlength; /* Not needed */
177
+
178
+ return ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr,
179
+ ARES_RR_NS_NSDNAME);
180
+ }
181
+
182
+ static ares_status_t ares_dns_parse_rr_cname(ares_buf_t *buf, ares_dns_rr_t *rr,
183
+ size_t rdlength)
184
+ {
185
+ (void)rdlength; /* Not needed */
186
+
187
+ return ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr,
188
+ ARES_RR_CNAME_CNAME);
189
+ }
190
+
191
+ static ares_status_t ares_dns_parse_rr_soa(ares_buf_t *buf, ares_dns_rr_t *rr,
192
+ size_t rdlength)
193
+ {
194
+ ares_status_t status;
195
+
196
+ (void)rdlength; /* Not needed */
197
+
198
+ /* MNAME */
199
+ status =
200
+ ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr, ARES_RR_SOA_MNAME);
201
+ if (status != ARES_SUCCESS) {
202
+ return status;
203
+ }
204
+
205
+ /* RNAME */
206
+ status =
207
+ ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr, ARES_RR_SOA_RNAME);
208
+ if (status != ARES_SUCCESS) {
209
+ return status;
210
+ }
211
+
212
+ /* SERIAL */
213
+ status = ares_dns_parse_and_set_be32(buf, rr, ARES_RR_SOA_SERIAL);
214
+ if (status != ARES_SUCCESS) {
215
+ return status;
216
+ }
217
+
218
+ /* REFRESH */
219
+ status = ares_dns_parse_and_set_be32(buf, rr, ARES_RR_SOA_REFRESH);
220
+ if (status != ARES_SUCCESS) {
221
+ return status;
222
+ }
223
+
224
+ /* RETRY */
225
+ status = ares_dns_parse_and_set_be32(buf, rr, ARES_RR_SOA_RETRY);
226
+ if (status != ARES_SUCCESS) {
227
+ return status;
228
+ }
229
+
230
+ /* EXPIRE */
231
+ status = ares_dns_parse_and_set_be32(buf, rr, ARES_RR_SOA_EXPIRE);
232
+ if (status != ARES_SUCCESS) {
233
+ return status;
234
+ }
235
+
236
+ /* MINIMUM */
237
+ return ares_dns_parse_and_set_be32(buf, rr, ARES_RR_SOA_MINIMUM);
238
+ }
239
+
240
+ static ares_status_t ares_dns_parse_rr_ptr(ares_buf_t *buf, ares_dns_rr_t *rr,
241
+ size_t rdlength)
242
+ {
243
+ (void)rdlength; /* Not needed */
244
+
245
+ return ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr,
246
+ ARES_RR_PTR_DNAME);
247
+ }
248
+
249
+ static ares_status_t ares_dns_parse_rr_hinfo(ares_buf_t *buf, ares_dns_rr_t *rr,
250
+ size_t rdlength)
251
+ {
252
+ ares_status_t status;
253
+ size_t orig_len = ares_buf_len(buf);
254
+
255
+ (void)rdlength; /* Not needed */
256
+
257
+ /* CPU */
258
+ status = ares_dns_parse_and_set_dns_str(
259
+ buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), rr,
260
+ ARES_RR_HINFO_CPU, ARES_TRUE);
261
+ if (status != ARES_SUCCESS) {
262
+ return status;
263
+ }
264
+
265
+ /* OS */
266
+ status = ares_dns_parse_and_set_dns_str(
267
+ buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), rr,
268
+ ARES_RR_HINFO_OS, ARES_TRUE);
269
+
270
+ return status;
271
+ }
272
+
273
+ static ares_status_t ares_dns_parse_rr_mx(ares_buf_t *buf, ares_dns_rr_t *rr,
274
+ size_t rdlength)
275
+ {
276
+ ares_status_t status;
277
+
278
+ (void)rdlength; /* Not needed */
279
+
280
+ /* PREFERENCE */
281
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_MX_PREFERENCE);
282
+ if (status != ARES_SUCCESS) {
283
+ return status;
284
+ }
285
+
286
+ /* EXCHANGE */
287
+ return ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr,
288
+ ARES_RR_MX_EXCHANGE);
289
+ }
290
+
291
+ static ares_status_t ares_dns_parse_rr_txt(ares_buf_t *buf, ares_dns_rr_t *rr,
292
+ size_t rdlength)
293
+ {
294
+ return ares_dns_parse_and_set_dns_abin(buf, rdlength, rr, ARES_RR_TXT_DATA,
295
+ ARES_FALSE);
296
+ }
297
+
298
+ static ares_status_t ares_dns_parse_rr_sig(ares_buf_t *buf, ares_dns_rr_t *rr,
299
+ size_t rdlength)
300
+ {
301
+ ares_status_t status;
302
+ size_t orig_len = ares_buf_len(buf);
303
+ size_t len;
304
+ unsigned char *data;
305
+
306
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_SIG_TYPE_COVERED);
307
+ if (status != ARES_SUCCESS) {
308
+ return status;
309
+ }
310
+
311
+ status = ares_dns_parse_and_set_u8(buf, rr, ARES_RR_SIG_ALGORITHM);
312
+ if (status != ARES_SUCCESS) {
313
+ return status;
314
+ }
315
+
316
+ status = ares_dns_parse_and_set_u8(buf, rr, ARES_RR_SIG_LABELS);
317
+ if (status != ARES_SUCCESS) {
318
+ return status;
319
+ }
320
+
321
+ status = ares_dns_parse_and_set_be32(buf, rr, ARES_RR_SIG_ORIGINAL_TTL);
322
+ if (status != ARES_SUCCESS) {
323
+ return status;
324
+ }
325
+
326
+ status = ares_dns_parse_and_set_be32(buf, rr, ARES_RR_SIG_EXPIRATION);
327
+ if (status != ARES_SUCCESS) {
328
+ return status;
329
+ }
330
+
331
+ status = ares_dns_parse_and_set_be32(buf, rr, ARES_RR_SIG_INCEPTION);
332
+ if (status != ARES_SUCCESS) {
333
+ return status;
334
+ }
335
+
336
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_SIG_KEY_TAG);
337
+ if (status != ARES_SUCCESS) {
338
+ return status;
339
+ }
340
+
341
+ status = ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr,
342
+ ARES_RR_SIG_SIGNERS_NAME);
343
+ if (status != ARES_SUCCESS) {
344
+ return status;
345
+ }
346
+
347
+ len = ares_dns_rr_remaining_len(buf, orig_len, rdlength);
348
+ if (len == 0) {
349
+ return ARES_EBADRESP;
350
+ }
351
+
352
+ status = ares_buf_fetch_bytes_dup(buf, len, ARES_FALSE, &data);
353
+ if (status != ARES_SUCCESS) {
354
+ return status;
355
+ }
356
+
357
+ status = ares_dns_rr_set_bin_own(rr, ARES_RR_SIG_SIGNATURE, data, len);
358
+ if (status != ARES_SUCCESS) {
359
+ ares_free(data);
360
+ return status;
361
+ }
362
+
363
+ return ARES_SUCCESS;
364
+ }
365
+
366
+ static ares_status_t ares_dns_parse_rr_aaaa(ares_buf_t *buf, ares_dns_rr_t *rr,
367
+ size_t rdlength)
368
+ {
369
+ struct ares_in6_addr addr;
370
+ ares_status_t status;
371
+
372
+ (void)rdlength; /* Not needed */
373
+
374
+ status = ares_buf_fetch_bytes(buf, (unsigned char *)&addr, sizeof(addr));
375
+ if (status != ARES_SUCCESS) {
376
+ return status;
377
+ }
378
+
379
+ return ares_dns_rr_set_addr6(rr, ARES_RR_AAAA_ADDR, &addr);
380
+ }
381
+
382
+ static ares_status_t ares_dns_parse_rr_srv(ares_buf_t *buf, ares_dns_rr_t *rr,
383
+ size_t rdlength)
384
+ {
385
+ ares_status_t status;
386
+
387
+ (void)rdlength; /* Not needed */
388
+
389
+ /* PRIORITY */
390
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_SRV_PRIORITY);
391
+ if (status != ARES_SUCCESS) {
392
+ return status;
393
+ }
394
+
395
+ /* WEIGHT */
396
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_SRV_WEIGHT);
397
+ if (status != ARES_SUCCESS) {
398
+ return status;
399
+ }
400
+
401
+ /* PORT */
402
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_SRV_PORT);
403
+ if (status != ARES_SUCCESS) {
404
+ return status;
405
+ }
406
+
407
+ /* TARGET */
408
+ return ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr,
409
+ ARES_RR_SRV_TARGET);
410
+ }
411
+
412
+ static ares_status_t ares_dns_parse_rr_naptr(ares_buf_t *buf, ares_dns_rr_t *rr,
413
+ size_t rdlength)
414
+ {
415
+ ares_status_t status;
416
+ size_t orig_len = ares_buf_len(buf);
417
+
418
+ /* ORDER */
419
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_NAPTR_ORDER);
420
+ if (status != ARES_SUCCESS) {
421
+ return status;
422
+ }
423
+
424
+ /* PREFERENCE */
425
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_NAPTR_PREFERENCE);
426
+ if (status != ARES_SUCCESS) {
427
+ return status;
428
+ }
429
+
430
+ /* FLAGS */
431
+ status = ares_dns_parse_and_set_dns_str(
432
+ buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), rr,
433
+ ARES_RR_NAPTR_FLAGS, ARES_TRUE);
434
+ if (status != ARES_SUCCESS) {
435
+ return status;
436
+ }
437
+
438
+ /* SERVICES */
439
+ status = ares_dns_parse_and_set_dns_str(
440
+ buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), rr,
441
+ ARES_RR_NAPTR_SERVICES, ARES_TRUE);
442
+ if (status != ARES_SUCCESS) {
443
+ return status;
444
+ }
445
+
446
+ /* REGEXP */
447
+ status = ares_dns_parse_and_set_dns_str(
448
+ buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), rr,
449
+ ARES_RR_NAPTR_REGEXP, ARES_TRUE);
450
+ if (status != ARES_SUCCESS) {
451
+ return status;
452
+ }
453
+
454
+ /* REPLACEMENT */
455
+ return ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr,
456
+ ARES_RR_NAPTR_REPLACEMENT);
457
+ }
458
+
459
+ static ares_status_t ares_dns_parse_rr_opt(ares_buf_t *buf, ares_dns_rr_t *rr,
460
+ size_t rdlength,
461
+ unsigned short raw_class,
462
+ unsigned int raw_ttl)
463
+ {
464
+ ares_status_t status;
465
+ size_t orig_len = ares_buf_len(buf);
466
+ unsigned short rcode_high;
467
+
468
+ status = ares_dns_rr_set_u16(rr, ARES_RR_OPT_UDP_SIZE, raw_class);
469
+ if (status != ARES_SUCCESS) {
470
+ return status;
471
+ }
472
+
473
+ /* First 8 bits of TTL are an extended RCODE, and they go in the higher order
474
+ * after the original 4-bit rcode */
475
+ rcode_high = (unsigned short)((raw_ttl >> 20) & 0x0FF0);
476
+ rr->parent->raw_rcode |= rcode_high;
477
+
478
+ status = ares_dns_rr_set_u8(rr, ARES_RR_OPT_VERSION,
479
+ (unsigned char)(raw_ttl >> 16) & 0xFF);
480
+ if (status != ARES_SUCCESS) {
481
+ return status;
482
+ }
483
+
484
+ status = ares_dns_rr_set_u16(rr, ARES_RR_OPT_FLAGS,
485
+ (unsigned short)(raw_ttl & 0xFFFF));
486
+ if (status != ARES_SUCCESS) {
487
+ return status;
488
+ }
489
+
490
+ /* Parse options */
491
+ while (ares_dns_rr_remaining_len(buf, orig_len, rdlength)) {
492
+ unsigned short opt = 0;
493
+ unsigned short len = 0;
494
+ unsigned char *val = NULL;
495
+
496
+ /* Fetch be16 option */
497
+ status = ares_buf_fetch_be16(buf, &opt);
498
+ if (status != ARES_SUCCESS) {
499
+ return status;
500
+ }
501
+
502
+ /* Fetch be16 length */
503
+ status = ares_buf_fetch_be16(buf, &len);
504
+ if (status != ARES_SUCCESS) {
505
+ return status;
506
+ }
507
+
508
+ if (len) {
509
+ status = ares_buf_fetch_bytes_dup(buf, len, ARES_TRUE, &val);
510
+ if (status != ARES_SUCCESS) {
511
+ return status;
512
+ }
513
+ }
514
+
515
+ status = ares_dns_rr_set_opt_own(rr, ARES_RR_OPT_OPTIONS, opt, val, len);
516
+ if (status != ARES_SUCCESS) {
517
+ return status;
518
+ }
519
+ }
520
+
521
+ return ARES_SUCCESS;
522
+ }
523
+
524
+ static ares_status_t ares_dns_parse_rr_tlsa(ares_buf_t *buf, ares_dns_rr_t *rr,
525
+ size_t rdlength)
526
+ {
527
+ ares_status_t status;
528
+ size_t orig_len = ares_buf_len(buf);
529
+ size_t len;
530
+ unsigned char *data;
531
+
532
+ status = ares_dns_parse_and_set_u8(buf, rr, ARES_RR_TLSA_CERT_USAGE);
533
+ if (status != ARES_SUCCESS) {
534
+ return status;
535
+ }
536
+
537
+ status = ares_dns_parse_and_set_u8(buf, rr, ARES_RR_TLSA_SELECTOR);
538
+ if (status != ARES_SUCCESS) {
539
+ return status;
540
+ }
541
+
542
+ status = ares_dns_parse_and_set_u8(buf, rr, ARES_RR_TLSA_MATCH);
543
+ if (status != ARES_SUCCESS) {
544
+ return status;
545
+ }
546
+
547
+ len = ares_dns_rr_remaining_len(buf, orig_len, rdlength);
548
+ if (len == 0) {
549
+ return ARES_EBADRESP;
550
+ }
551
+
552
+ status = ares_buf_fetch_bytes_dup(buf, len, ARES_FALSE, &data);
553
+ if (status != ARES_SUCCESS) {
554
+ return status;
555
+ }
556
+
557
+ status = ares_dns_rr_set_bin_own(rr, ARES_RR_TLSA_DATA, data, len);
558
+ if (status != ARES_SUCCESS) {
559
+ ares_free(data);
560
+ return status;
561
+ }
562
+
563
+ return ARES_SUCCESS;
564
+ }
565
+
566
+ static ares_status_t ares_dns_parse_rr_svcb(ares_buf_t *buf, ares_dns_rr_t *rr,
567
+ size_t rdlength)
568
+ {
569
+ ares_status_t status;
570
+ size_t orig_len = ares_buf_len(buf);
571
+
572
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_SVCB_PRIORITY);
573
+ if (status != ARES_SUCCESS) {
574
+ return status;
575
+ }
576
+
577
+ status =
578
+ ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr, ARES_RR_SVCB_TARGET);
579
+ if (status != ARES_SUCCESS) {
580
+ return status;
581
+ }
582
+
583
+ /* Parse params */
584
+ while (ares_dns_rr_remaining_len(buf, orig_len, rdlength)) {
585
+ unsigned short opt = 0;
586
+ unsigned short len = 0;
587
+ unsigned char *val = NULL;
588
+
589
+ /* Fetch be16 option */
590
+ status = ares_buf_fetch_be16(buf, &opt);
591
+ if (status != ARES_SUCCESS) {
592
+ return status;
593
+ }
594
+
595
+ /* Fetch be16 length */
596
+ status = ares_buf_fetch_be16(buf, &len);
597
+ if (status != ARES_SUCCESS) {
598
+ return status;
599
+ }
600
+
601
+ if (len) {
602
+ status = ares_buf_fetch_bytes_dup(buf, len, ARES_TRUE, &val);
603
+ if (status != ARES_SUCCESS) {
604
+ return status;
605
+ }
606
+ }
607
+
608
+ status = ares_dns_rr_set_opt_own(rr, ARES_RR_SVCB_PARAMS, opt, val, len);
609
+ if (status != ARES_SUCCESS) {
610
+ return status;
611
+ }
612
+ }
613
+
614
+ return ARES_SUCCESS;
615
+ }
616
+
617
+ static ares_status_t ares_dns_parse_rr_https(ares_buf_t *buf, ares_dns_rr_t *rr,
618
+ size_t rdlength)
619
+ {
620
+ ares_status_t status;
621
+ size_t orig_len = ares_buf_len(buf);
622
+
623
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_HTTPS_PRIORITY);
624
+ if (status != ARES_SUCCESS) {
625
+ return status;
626
+ }
627
+
628
+ status =
629
+ ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr, ARES_RR_HTTPS_TARGET);
630
+ if (status != ARES_SUCCESS) {
631
+ return status;
632
+ }
633
+
634
+ /* Parse params */
635
+ while (ares_dns_rr_remaining_len(buf, orig_len, rdlength)) {
636
+ unsigned short opt = 0;
637
+ unsigned short len = 0;
638
+ unsigned char *val = NULL;
639
+
640
+ /* Fetch be16 option */
641
+ status = ares_buf_fetch_be16(buf, &opt);
642
+ if (status != ARES_SUCCESS) {
643
+ return status;
644
+ }
645
+
646
+ /* Fetch be16 length */
647
+ status = ares_buf_fetch_be16(buf, &len);
648
+ if (status != ARES_SUCCESS) {
649
+ return status;
650
+ }
651
+
652
+ if (len) {
653
+ status = ares_buf_fetch_bytes_dup(buf, len, ARES_TRUE, &val);
654
+ if (status != ARES_SUCCESS) {
655
+ return status;
656
+ }
657
+ }
658
+
659
+ status = ares_dns_rr_set_opt_own(rr, ARES_RR_HTTPS_PARAMS, opt, val, len);
660
+ if (status != ARES_SUCCESS) {
661
+ return status;
662
+ }
663
+ }
664
+
665
+ return ARES_SUCCESS;
666
+ }
667
+
668
+ static ares_status_t ares_dns_parse_rr_uri(ares_buf_t *buf, ares_dns_rr_t *rr,
669
+ size_t rdlength)
670
+ {
671
+ char *name = NULL;
672
+ ares_status_t status;
673
+ size_t orig_len = ares_buf_len(buf);
674
+ size_t remaining_len;
675
+
676
+ /* PRIORITY */
677
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_URI_PRIORITY);
678
+ if (status != ARES_SUCCESS) {
679
+ return status;
680
+ }
681
+
682
+ /* WEIGHT */
683
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_URI_WEIGHT);
684
+ if (status != ARES_SUCCESS) {
685
+ return status;
686
+ }
687
+
688
+ /* TARGET -- not in string format, rest of buffer, required to be
689
+ * non-zero length */
690
+ remaining_len = ares_dns_rr_remaining_len(buf, orig_len, rdlength);
691
+ if (remaining_len == 0) {
692
+ status = ARES_EBADRESP;
693
+ return status;
694
+ }
695
+
696
+ /* NOTE: Not in DNS string format */
697
+ status = ares_buf_fetch_str_dup(buf, remaining_len, &name);
698
+ if (status != ARES_SUCCESS) {
699
+ return status;
700
+ }
701
+
702
+ if (!ares_str_isprint(name, remaining_len)) {
703
+ ares_free(name);
704
+ return ARES_EBADRESP;
705
+ }
706
+
707
+ status = ares_dns_rr_set_str_own(rr, ARES_RR_URI_TARGET, name);
708
+ if (status != ARES_SUCCESS) {
709
+ ares_free(name);
710
+ return status;
711
+ }
712
+ name = NULL;
713
+
714
+ return ARES_SUCCESS;
715
+ }
716
+
717
+ static ares_status_t ares_dns_parse_rr_caa(ares_buf_t *buf, ares_dns_rr_t *rr,
718
+ size_t rdlength)
719
+ {
720
+ unsigned char *data = NULL;
721
+ size_t data_len = 0;
722
+ ares_status_t status;
723
+ size_t orig_len = ares_buf_len(buf);
724
+
725
+ /* CRITICAL */
726
+ status = ares_dns_parse_and_set_u8(buf, rr, ARES_RR_CAA_CRITICAL);
727
+ if (status != ARES_SUCCESS) {
728
+ return status;
729
+ }
730
+
731
+ /* Tag */
732
+ status = ares_dns_parse_and_set_dns_str(
733
+ buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), rr,
734
+ ARES_RR_CAA_TAG, ARES_FALSE);
735
+ if (status != ARES_SUCCESS) {
736
+ return status;
737
+ }
738
+
739
+ /* Value - binary! (remaining buffer */
740
+ data_len = ares_dns_rr_remaining_len(buf, orig_len, rdlength);
741
+ if (data_len == 0) {
742
+ status = ARES_EBADRESP;
743
+ return status;
744
+ }
745
+ status = ares_buf_fetch_bytes_dup(buf, data_len, ARES_TRUE, &data);
746
+ if (status != ARES_SUCCESS) {
747
+ return status;
748
+ }
749
+
750
+ status = ares_dns_rr_set_bin_own(rr, ARES_RR_CAA_VALUE, data, data_len);
751
+ if (status != ARES_SUCCESS) {
752
+ ares_free(data);
753
+ return status;
754
+ }
755
+ data = NULL;
756
+
757
+ return ARES_SUCCESS;
758
+ }
759
+
760
+ static ares_status_t ares_dns_parse_rr_raw_rr(ares_buf_t *buf,
761
+ ares_dns_rr_t *rr,
762
+ size_t rdlength,
763
+ unsigned short raw_type)
764
+ {
765
+ ares_status_t status;
766
+ unsigned char *bytes = NULL;
767
+
768
+ if (rdlength == 0) {
769
+ return ARES_SUCCESS;
770
+ }
771
+
772
+ status = ares_buf_fetch_bytes_dup(buf, rdlength, ARES_FALSE, &bytes);
773
+ if (status != ARES_SUCCESS) {
774
+ return status;
775
+ }
776
+
777
+ /* Can't fail */
778
+ status = ares_dns_rr_set_u16(rr, ARES_RR_RAW_RR_TYPE, raw_type);
779
+ if (status != ARES_SUCCESS) {
780
+ ares_free(bytes);
781
+ return status;
782
+ }
783
+
784
+ status = ares_dns_rr_set_bin_own(rr, ARES_RR_RAW_RR_DATA, bytes, rdlength);
785
+ if (status != ARES_SUCCESS) {
786
+ ares_free(bytes);
787
+ return status;
788
+ }
789
+
790
+ return ARES_SUCCESS;
791
+ }
792
+
793
+ static ares_status_t ares_dns_parse_header(ares_buf_t *buf, unsigned int flags,
794
+ ares_dns_record_t **dnsrec,
795
+ unsigned short *qdcount,
796
+ unsigned short *ancount,
797
+ unsigned short *nscount,
798
+ unsigned short *arcount)
799
+ {
800
+ ares_status_t status = ARES_EBADRESP;
801
+ unsigned short u16;
802
+ unsigned short id;
803
+ unsigned short dns_flags = 0;
804
+ ares_dns_opcode_t opcode;
805
+ unsigned short rcode;
806
+
807
+ (void)flags; /* currently unused */
808
+
809
+ if (buf == NULL || dnsrec == NULL || qdcount == NULL || ancount == NULL ||
810
+ nscount == NULL || arcount == NULL) {
811
+ return ARES_EFORMERR;
812
+ }
813
+
814
+ *dnsrec = NULL;
815
+
816
+ /*
817
+ * RFC 1035 4.1.1. Header section format.
818
+ * and Updated by RFC 2065 to add AD and CD bits.
819
+ * 1 1 1 1 1 1
820
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
821
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
822
+ * | ID |
823
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
824
+ * |QR| Opcode |AA|TC|RD|RA| Z|AD|CD| RCODE |
825
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
826
+ * | QDCOUNT |
827
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
828
+ * | ANCOUNT |
829
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
830
+ * | NSCOUNT |
831
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
832
+ * | ARCOUNT |
833
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
834
+ */
835
+
836
+ /* ID */
837
+ status = ares_buf_fetch_be16(buf, &id);
838
+ if (status != ARES_SUCCESS) {
839
+ goto fail;
840
+ }
841
+
842
+ /* Flags */
843
+ status = ares_buf_fetch_be16(buf, &u16);
844
+ if (status != ARES_SUCCESS) {
845
+ goto fail;
846
+ }
847
+
848
+ /* QR */
849
+ if (u16 & 0x8000) {
850
+ dns_flags |= ARES_FLAG_QR;
851
+ }
852
+
853
+ /* OPCODE */
854
+ opcode = (u16 >> 11) & 0xf;
855
+
856
+ /* AA */
857
+ if (u16 & 0x400) {
858
+ dns_flags |= ARES_FLAG_AA;
859
+ }
860
+
861
+ /* TC */
862
+ if (u16 & 0x200) {
863
+ dns_flags |= ARES_FLAG_TC;
864
+ }
865
+
866
+ /* RD */
867
+ if (u16 & 0x100) {
868
+ dns_flags |= ARES_FLAG_RD;
869
+ }
870
+
871
+ /* RA */
872
+ if (u16 & 0x80) {
873
+ dns_flags |= ARES_FLAG_RA;
874
+ }
875
+
876
+ /* Z -- unused */
877
+
878
+ /* AD */
879
+ if (u16 & 0x20) {
880
+ dns_flags |= ARES_FLAG_AD;
881
+ }
882
+
883
+ /* CD */
884
+ if (u16 & 0x10) {
885
+ dns_flags |= ARES_FLAG_CD;
886
+ }
887
+
888
+ /* RCODE */
889
+ rcode = u16 & 0xf;
890
+
891
+ /* QDCOUNT */
892
+ status = ares_buf_fetch_be16(buf, qdcount);
893
+ if (status != ARES_SUCCESS) {
894
+ goto fail;
895
+ }
896
+
897
+ /* ANCOUNT */
898
+ status = ares_buf_fetch_be16(buf, ancount);
899
+ if (status != ARES_SUCCESS) {
900
+ goto fail;
901
+ }
902
+
903
+ /* NSCOUNT */
904
+ status = ares_buf_fetch_be16(buf, nscount);
905
+ if (status != ARES_SUCCESS) {
906
+ goto fail;
907
+ }
908
+
909
+ /* ARCOUNT */
910
+ status = ares_buf_fetch_be16(buf, arcount);
911
+ if (status != ARES_SUCCESS) {
912
+ goto fail;
913
+ }
914
+
915
+ status = ares_dns_record_create(dnsrec, id, dns_flags, opcode,
916
+ ARES_RCODE_NOERROR /* Temporary */);
917
+ if (status != ARES_SUCCESS) {
918
+ goto fail;
919
+ }
920
+
921
+ (*dnsrec)->raw_rcode = rcode;
922
+
923
+ if (*ancount > 0) {
924
+ status =
925
+ ares_dns_record_rr_prealloc(*dnsrec, ARES_SECTION_ANSWER, *ancount);
926
+ if (status != ARES_SUCCESS) {
927
+ goto fail; /* LCOV_EXCL_LINE: OutOfMemory */
928
+ }
929
+ }
930
+
931
+ if (*nscount > 0) {
932
+ status =
933
+ ares_dns_record_rr_prealloc(*dnsrec, ARES_SECTION_AUTHORITY, *nscount);
934
+ if (status != ARES_SUCCESS) {
935
+ goto fail; /* LCOV_EXCL_LINE: OutOfMemory */
936
+ }
937
+ }
938
+
939
+ if (*arcount > 0) {
940
+ status =
941
+ ares_dns_record_rr_prealloc(*dnsrec, ARES_SECTION_ADDITIONAL, *arcount);
942
+ if (status != ARES_SUCCESS) {
943
+ goto fail; /* LCOV_EXCL_LINE: OutOfMemory */
944
+ }
945
+ }
946
+
947
+ return ARES_SUCCESS;
948
+
949
+ fail:
950
+ ares_dns_record_destroy(*dnsrec);
951
+ *dnsrec = NULL;
952
+ *qdcount = 0;
953
+ *ancount = 0;
954
+ *nscount = 0;
955
+ *arcount = 0;
956
+
957
+ return status;
958
+ }
959
+
960
+ static ares_status_t
961
+ ares_dns_parse_rr_data(ares_buf_t *buf, size_t rdlength, ares_dns_rr_t *rr,
962
+ ares_dns_rec_type_t type, unsigned short raw_type,
963
+ unsigned short raw_class, unsigned int raw_ttl)
964
+ {
965
+ switch (type) {
966
+ case ARES_REC_TYPE_A:
967
+ return ares_dns_parse_rr_a(buf, rr, rdlength);
968
+ case ARES_REC_TYPE_NS:
969
+ return ares_dns_parse_rr_ns(buf, rr, rdlength);
970
+ case ARES_REC_TYPE_CNAME:
971
+ return ares_dns_parse_rr_cname(buf, rr, rdlength);
972
+ case ARES_REC_TYPE_SOA:
973
+ return ares_dns_parse_rr_soa(buf, rr, rdlength);
974
+ case ARES_REC_TYPE_PTR:
975
+ return ares_dns_parse_rr_ptr(buf, rr, rdlength);
976
+ case ARES_REC_TYPE_HINFO:
977
+ return ares_dns_parse_rr_hinfo(buf, rr, rdlength);
978
+ case ARES_REC_TYPE_MX:
979
+ return ares_dns_parse_rr_mx(buf, rr, rdlength);
980
+ case ARES_REC_TYPE_TXT:
981
+ return ares_dns_parse_rr_txt(buf, rr, rdlength);
982
+ case ARES_REC_TYPE_SIG:
983
+ return ares_dns_parse_rr_sig(buf, rr, rdlength);
984
+ case ARES_REC_TYPE_AAAA:
985
+ return ares_dns_parse_rr_aaaa(buf, rr, rdlength);
986
+ case ARES_REC_TYPE_SRV:
987
+ return ares_dns_parse_rr_srv(buf, rr, rdlength);
988
+ case ARES_REC_TYPE_NAPTR:
989
+ return ares_dns_parse_rr_naptr(buf, rr, rdlength);
990
+ case ARES_REC_TYPE_ANY:
991
+ return ARES_EBADRESP;
992
+ case ARES_REC_TYPE_OPT:
993
+ return ares_dns_parse_rr_opt(buf, rr, rdlength, raw_class, raw_ttl);
994
+ case ARES_REC_TYPE_TLSA:
995
+ return ares_dns_parse_rr_tlsa(buf, rr, rdlength);
996
+ case ARES_REC_TYPE_SVCB:
997
+ return ares_dns_parse_rr_svcb(buf, rr, rdlength);
998
+ case ARES_REC_TYPE_HTTPS:
999
+ return ares_dns_parse_rr_https(buf, rr, rdlength);
1000
+ case ARES_REC_TYPE_URI:
1001
+ return ares_dns_parse_rr_uri(buf, rr, rdlength);
1002
+ case ARES_REC_TYPE_CAA:
1003
+ return ares_dns_parse_rr_caa(buf, rr, rdlength);
1004
+ case ARES_REC_TYPE_RAW_RR:
1005
+ return ares_dns_parse_rr_raw_rr(buf, rr, rdlength, raw_type);
1006
+ }
1007
+ return ARES_EFORMERR;
1008
+ }
1009
+
1010
+ static ares_status_t ares_dns_parse_qd(ares_buf_t *buf,
1011
+ ares_dns_record_t *dnsrec)
1012
+ {
1013
+ char *name = NULL;
1014
+ unsigned short u16;
1015
+ ares_status_t status;
1016
+ ares_dns_rec_type_t type;
1017
+ ares_dns_class_t qclass;
1018
+ /* The question section is used to carry the "question" in most queries,
1019
+ * i.e., the parameters that define what is being asked. The section
1020
+ * contains QDCOUNT (usually 1) entries, each of the following format:
1021
+ * 1 1 1 1 1 1
1022
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
1023
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1024
+ * | |
1025
+ * / QNAME /
1026
+ * / /
1027
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1028
+ * | QTYPE |
1029
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1030
+ * | QCLASS |
1031
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1032
+ */
1033
+
1034
+ /* Name */
1035
+ status = ares_dns_name_parse(buf, &name, ARES_FALSE);
1036
+ if (status != ARES_SUCCESS) {
1037
+ goto done;
1038
+ }
1039
+
1040
+ /* Type */
1041
+ status = ares_buf_fetch_be16(buf, &u16);
1042
+ if (status != ARES_SUCCESS) {
1043
+ goto done;
1044
+ }
1045
+ type = u16;
1046
+
1047
+ /* Class */
1048
+ status = ares_buf_fetch_be16(buf, &u16);
1049
+ if (status != ARES_SUCCESS) {
1050
+ goto done;
1051
+ }
1052
+ qclass = u16;
1053
+
1054
+ /* Add question */
1055
+ status = ares_dns_record_query_add(dnsrec, name, type, qclass);
1056
+ if (status != ARES_SUCCESS) {
1057
+ goto done;
1058
+ }
1059
+
1060
+ done:
1061
+ ares_free(name);
1062
+ return status;
1063
+ }
1064
+
1065
+ static ares_status_t ares_dns_parse_rr(ares_buf_t *buf, unsigned int flags,
1066
+ ares_dns_section_t sect,
1067
+ ares_dns_record_t *dnsrec)
1068
+ {
1069
+ char *name = NULL;
1070
+ unsigned short u16;
1071
+ unsigned short raw_type;
1072
+ ares_status_t status;
1073
+ ares_dns_rec_type_t type;
1074
+ ares_dns_class_t qclass;
1075
+ unsigned int ttl;
1076
+ size_t rdlength;
1077
+ ares_dns_rr_t *rr = NULL;
1078
+ size_t remaining_len = 0;
1079
+ size_t processed_len = 0;
1080
+ ares_bool_t namecomp;
1081
+
1082
+ /* All RRs have the same top level format shown below:
1083
+ * 1 1 1 1 1 1
1084
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
1085
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1086
+ * | |
1087
+ * / /
1088
+ * / NAME /
1089
+ * | |
1090
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1091
+ * | TYPE |
1092
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1093
+ * | CLASS |
1094
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1095
+ * | TTL |
1096
+ * | |
1097
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1098
+ * | RDLENGTH |
1099
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
1100
+ * / RDATA /
1101
+ * / /
1102
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1103
+ */
1104
+
1105
+ /* Name */
1106
+ status = ares_dns_name_parse(buf, &name, ARES_FALSE);
1107
+ if (status != ARES_SUCCESS) {
1108
+ goto done;
1109
+ }
1110
+
1111
+ /* Type */
1112
+ status = ares_buf_fetch_be16(buf, &u16);
1113
+ if (status != ARES_SUCCESS) {
1114
+ goto done;
1115
+ }
1116
+ type = u16;
1117
+ raw_type = u16; /* Only used for raw rr data */
1118
+
1119
+ /* Class */
1120
+ status = ares_buf_fetch_be16(buf, &u16);
1121
+ if (status != ARES_SUCCESS) {
1122
+ goto done;
1123
+ }
1124
+ qclass = u16;
1125
+
1126
+ /* TTL */
1127
+ status = ares_buf_fetch_be32(buf, &ttl);
1128
+ if (status != ARES_SUCCESS) {
1129
+ goto done;
1130
+ }
1131
+
1132
+ /* Length */
1133
+ status = ares_buf_fetch_be16(buf, &u16);
1134
+ if (status != ARES_SUCCESS) {
1135
+ goto done;
1136
+ }
1137
+ rdlength = u16;
1138
+
1139
+ if (!ares_dns_rec_type_isvalid(type, ARES_FALSE)) {
1140
+ type = ARES_REC_TYPE_RAW_RR;
1141
+ }
1142
+
1143
+ namecomp = ares_dns_rec_allow_name_comp(type);
1144
+ if (sect == ARES_SECTION_ANSWER &&
1145
+ (flags &
1146
+ (namecomp ? ARES_DNS_PARSE_AN_BASE_RAW : ARES_DNS_PARSE_AN_EXT_RAW))) {
1147
+ type = ARES_REC_TYPE_RAW_RR;
1148
+ }
1149
+ if (sect == ARES_SECTION_AUTHORITY &&
1150
+ (flags &
1151
+ (namecomp ? ARES_DNS_PARSE_NS_BASE_RAW : ARES_DNS_PARSE_NS_EXT_RAW))) {
1152
+ type = ARES_REC_TYPE_RAW_RR;
1153
+ }
1154
+ if (sect == ARES_SECTION_ADDITIONAL &&
1155
+ (flags &
1156
+ (namecomp ? ARES_DNS_PARSE_AR_BASE_RAW : ARES_DNS_PARSE_AR_EXT_RAW))) {
1157
+ type = ARES_REC_TYPE_RAW_RR;
1158
+ }
1159
+
1160
+ /* Pull into another buffer for safety */
1161
+ if (rdlength > ares_buf_len(buf)) {
1162
+ status = ARES_EBADRESP;
1163
+ goto done;
1164
+ }
1165
+
1166
+ /* Add the base rr */
1167
+ status =
1168
+ ares_dns_record_rr_add(&rr, dnsrec, sect, name, type,
1169
+ type == ARES_REC_TYPE_OPT ? ARES_CLASS_IN : qclass,
1170
+ type == ARES_REC_TYPE_OPT ? 0 : ttl);
1171
+ if (status != ARES_SUCCESS) {
1172
+ goto done;
1173
+ }
1174
+
1175
+ /* Record the current remaining length in the buffer so we can tell how
1176
+ * much was processed */
1177
+ remaining_len = ares_buf_len(buf);
1178
+
1179
+ /* Fill in the data for the rr */
1180
+ status = ares_dns_parse_rr_data(buf, rdlength, rr, type, raw_type,
1181
+ (unsigned short)qclass, ttl);
1182
+ if (status != ARES_SUCCESS) {
1183
+ goto done;
1184
+ }
1185
+
1186
+ /* Determine how many bytes were processed */
1187
+ processed_len = remaining_len - ares_buf_len(buf);
1188
+
1189
+ /* If too many bytes were processed, error! */
1190
+ if (processed_len > rdlength) {
1191
+ status = ARES_EBADRESP;
1192
+ goto done;
1193
+ }
1194
+
1195
+ /* If too few bytes were processed, consume the unprocessed data for this
1196
+ * record as the parser may not have wanted/needed to use it */
1197
+ if (processed_len < rdlength) {
1198
+ ares_buf_consume(buf, rdlength - processed_len);
1199
+ }
1200
+
1201
+
1202
+ done:
1203
+ ares_free(name);
1204
+ return status;
1205
+ }
1206
+
1207
+ static ares_status_t ares_dns_parse_buf(ares_buf_t *buf, unsigned int flags,
1208
+ ares_dns_record_t **dnsrec)
1209
+ {
1210
+ ares_status_t status;
1211
+ unsigned short qdcount;
1212
+ unsigned short ancount;
1213
+ unsigned short nscount;
1214
+ unsigned short arcount;
1215
+ unsigned short i;
1216
+
1217
+ if (buf == NULL || dnsrec == NULL) {
1218
+ return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */
1219
+ }
1220
+
1221
+ /* Maximum DNS packet size is 64k, even over TCP */
1222
+ if (ares_buf_len(buf) > 0xFFFF) {
1223
+ return ARES_EFORMERR;
1224
+ }
1225
+
1226
+ /* All communications inside of the domain protocol are carried in a single
1227
+ * format called a message. The top level format of message is divided
1228
+ * into 5 sections (some of which are empty in certain cases) shown below:
1229
+ *
1230
+ * +---------------------+
1231
+ * | Header |
1232
+ * +---------------------+
1233
+ * | Question | the question for the name server
1234
+ * +---------------------+
1235
+ * | Answer | RRs answering the question
1236
+ * +---------------------+
1237
+ * | Authority | RRs pointing toward an authority
1238
+ * +---------------------+
1239
+ * | Additional | RRs holding additional information
1240
+ * +---------------------+
1241
+ */
1242
+
1243
+ /* Parse header */
1244
+ status = ares_dns_parse_header(buf, flags, dnsrec, &qdcount, &ancount,
1245
+ &nscount, &arcount);
1246
+ if (status != ARES_SUCCESS) {
1247
+ goto fail;
1248
+ }
1249
+
1250
+ /* Must have questions */
1251
+ if (qdcount == 0) {
1252
+ status = ARES_EBADRESP;
1253
+ goto fail;
1254
+ }
1255
+
1256
+ /* XXX: this should be controlled by a flag in case we want to allow
1257
+ * multiple questions. I think mDNS allows this */
1258
+ if (qdcount > 1) {
1259
+ status = ARES_EBADRESP;
1260
+ goto fail;
1261
+ }
1262
+
1263
+ /* Parse questions */
1264
+ for (i = 0; i < qdcount; i++) {
1265
+ status = ares_dns_parse_qd(buf, *dnsrec);
1266
+ if (status != ARES_SUCCESS) {
1267
+ goto fail;
1268
+ }
1269
+ }
1270
+
1271
+ /* Parse Answers */
1272
+ for (i = 0; i < ancount; i++) {
1273
+ status = ares_dns_parse_rr(buf, flags, ARES_SECTION_ANSWER, *dnsrec);
1274
+ if (status != ARES_SUCCESS) {
1275
+ goto fail;
1276
+ }
1277
+ }
1278
+
1279
+ /* Parse Authority */
1280
+ for (i = 0; i < nscount; i++) {
1281
+ status = ares_dns_parse_rr(buf, flags, ARES_SECTION_AUTHORITY, *dnsrec);
1282
+ if (status != ARES_SUCCESS) {
1283
+ goto fail;
1284
+ }
1285
+ }
1286
+
1287
+ /* Parse Additional */
1288
+ for (i = 0; i < arcount; i++) {
1289
+ status = ares_dns_parse_rr(buf, flags, ARES_SECTION_ADDITIONAL, *dnsrec);
1290
+ if (status != ARES_SUCCESS) {
1291
+ goto fail;
1292
+ }
1293
+ }
1294
+
1295
+ /* Finalize rcode now that if we have OPT it is processed */
1296
+ if (!ares_dns_rcode_isvalid((*dnsrec)->raw_rcode)) {
1297
+ (*dnsrec)->rcode = ARES_RCODE_SERVFAIL;
1298
+ } else {
1299
+ (*dnsrec)->rcode = (ares_dns_rcode_t)(*dnsrec)->raw_rcode;
1300
+ }
1301
+
1302
+ return ARES_SUCCESS;
1303
+
1304
+ fail:
1305
+ ares_dns_record_destroy(*dnsrec);
1306
+ *dnsrec = NULL;
1307
+ return status;
1308
+ }
1309
+
1310
+ ares_status_t ares_dns_parse(const unsigned char *buf, size_t buf_len,
1311
+ unsigned int flags, ares_dns_record_t **dnsrec)
1312
+ {
1313
+ ares_buf_t *parser = NULL;
1314
+ ares_status_t status;
1315
+
1316
+ if (buf == NULL || buf_len == 0 || dnsrec == NULL) {
1317
+ return ARES_EFORMERR;
1318
+ }
1319
+
1320
+ parser = ares_buf_create_const(buf, buf_len);
1321
+ if (parser == NULL) {
1322
+ return ARES_ENOMEM;
1323
+ }
1324
+
1325
+ status = ares_dns_parse_buf(parser, flags, dnsrec);
1326
+ ares_buf_destroy(parser);
1327
+
1328
+ return status;
1329
+ }