grpc 1.74.1 → 1.75.0.pre1

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 (368) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +83 -41
  3. data/include/grpc/credentials.h +7 -1
  4. data/src/core/call/client_call.cc +4 -4
  5. data/src/core/call/filter_fusion.h +1230 -0
  6. data/src/core/call/metadata.cc +22 -0
  7. data/src/core/call/metadata.h +24 -2
  8. data/src/core/channelz/channelz.cc +10 -17
  9. data/src/core/channelz/channelz.h +58 -19
  10. data/src/core/channelz/channelz_registry.cc +0 -162
  11. data/src/core/channelz/channelz_registry.h +14 -7
  12. data/src/core/channelz/property_list.cc +19 -23
  13. data/src/core/channelz/property_list.h +3 -1
  14. data/src/core/channelz/v2tov1/convert.cc +683 -0
  15. data/src/core/channelz/v2tov1/convert.h +58 -0
  16. data/src/core/channelz/v2tov1/legacy_api.cc +425 -0
  17. data/src/core/channelz/v2tov1/legacy_api.h +32 -0
  18. data/src/core/channelz/v2tov1/property_list.cc +118 -0
  19. data/src/core/channelz/v2tov1/property_list.h +52 -0
  20. data/src/core/client_channel/client_channel_filter.cc +5 -4
  21. data/src/core/client_channel/client_channel_filter.h +2 -2
  22. data/src/core/client_channel/client_channel_internal.h +2 -1
  23. data/src/core/client_channel/load_balanced_call_destination.cc +6 -5
  24. data/src/core/client_channel/subchannel.cc +14 -6
  25. data/src/core/client_channel/subchannel.h +2 -0
  26. data/src/core/config/core_configuration.cc +3 -1
  27. data/src/core/config/core_configuration.h +12 -0
  28. data/src/core/credentials/transport/alts/alts_credentials.cc +5 -0
  29. data/src/core/credentials/transport/alts/check_gcp_environment_windows.cc +2 -0
  30. data/src/core/credentials/transport/channel_creds_registry_init.cc +3 -1
  31. data/src/core/credentials/transport/ssl/ssl_credentials.cc +1 -1
  32. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +8 -3
  33. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +29 -24
  34. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +19 -8
  35. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +96 -54
  36. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +15 -2
  37. data/src/core/credentials/transport/tls/spiffe_utils.cc +371 -0
  38. data/src/core/credentials/transport/tls/spiffe_utils.h +171 -0
  39. data/src/core/credentials/transport/tls/ssl_utils.cc +11 -10
  40. data/src/core/credentials/transport/tls/ssl_utils.h +4 -2
  41. data/src/core/credentials/transport/tls/tls_credentials.cc +2 -0
  42. data/src/core/credentials/transport/tls/tls_security_connector.cc +11 -26
  43. data/src/core/credentials/transport/tls/tls_security_connector.h +12 -12
  44. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +1 -2
  45. data/src/core/ext/filters/http/client/http_client_filter.cc +3 -6
  46. data/src/core/ext/filters/http/client_authority_filter.cc +1 -2
  47. data/src/core/ext/filters/http/message_compress/compression_filter.cc +8 -8
  48. data/src/core/ext/filters/http/server/http_server_filter.cc +3 -6
  49. data/src/core/ext/filters/message_size/message_size_filter.cc +4 -4
  50. data/src/core/ext/filters/rbac/rbac_filter.cc +1 -1
  51. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +3 -5
  52. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +3 -2
  53. data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -0
  54. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -0
  55. data/src/core/ext/transport/chttp2/transport/frame.cc +89 -6
  56. data/src/core/ext/transport/chttp2/transport/frame.h +38 -0
  57. data/src/core/ext/transport/chttp2/transport/header_assembler.h +5 -14
  58. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +4 -1
  59. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +294 -78
  60. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +128 -9
  61. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +11 -38
  62. data/src/core/ext/transport/chttp2/transport/http2_settings.h +52 -35
  63. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +61 -0
  64. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +142 -0
  65. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +81 -3
  66. data/src/core/ext/transport/chttp2/transport/http2_transport.h +12 -1
  67. data/src/core/ext/transport/chttp2/transport/message_assembler.h +2 -2
  68. data/src/core/ext/transport/chttp2/transport/parsing.cc +2 -1
  69. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +2 -1
  70. data/src/core/ext/transport/chttp2/transport/ping_promise.h +22 -5
  71. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +607 -0
  72. data/src/core/ext/transport/chttp2/transport/writable_streams.h +254 -0
  73. data/src/core/ext/transport/chttp2/transport/writing.cc +6 -4
  74. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb.h +4959 -0
  75. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb_minitable.c +1111 -0
  76. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb_minitable.h +108 -0
  77. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb.h +142 -54
  78. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.c +18 -14
  79. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.h +2 -2
  80. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.c +716 -0
  81. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.h +227 -0
  82. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.c +86 -88
  83. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.h +2 -2
  84. data/src/core/filter/auth/auth_filters.h +2 -2
  85. data/src/core/filter/fused_filters.cc +154 -0
  86. data/src/core/handshaker/security/legacy_secure_endpoint.cc +1 -1
  87. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +965 -0
  88. data/src/core/handshaker/security/secure_endpoint.cc +28 -13
  89. data/src/core/handshaker/security/secure_endpoint.h +8 -0
  90. data/src/core/lib/channel/promise_based_filter.cc +15 -25
  91. data/src/core/lib/channel/promise_based_filter.h +6 -5
  92. data/src/core/lib/event_engine/ares_resolver.h +3 -1
  93. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +9 -5
  94. data/src/core/lib/event_engine/cf_engine/cf_engine.h +2 -1
  95. data/src/core/lib/event_engine/cf_engine/cfsocket_listener.cc +263 -0
  96. data/src/core/lib/event_engine/cf_engine/cfsocket_listener.h +107 -0
  97. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +31 -3
  98. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +12 -0
  99. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +12 -10
  100. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +6 -4
  101. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +15 -14
  102. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +7 -5
  103. data/src/core/lib/event_engine/posix_engine/event_poller.h +0 -8
  104. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +11 -5
  105. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.h +3 -2
  106. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +1 -0
  107. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +4 -4
  108. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +3 -4
  109. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +2 -2
  110. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +188 -199
  111. data/src/core/lib/event_engine/posix_engine/posix_engine.h +30 -45
  112. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +1 -1
  113. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +1 -1
  114. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +2 -1
  115. data/src/core/lib/experiments/experiments.cc +120 -6
  116. data/src/core/lib/experiments/experiments.h +46 -3
  117. data/src/core/lib/iomgr/combiner.cc +1 -1
  118. data/src/core/lib/iomgr/exec_ctx.h +3 -9
  119. data/src/core/lib/iomgr/socket_mutator.cc +1 -1
  120. data/src/core/lib/iomgr/socket_utils_posix.cc +1 -1
  121. data/src/core/lib/iomgr/socket_utils_posix.h +1 -1
  122. data/src/core/lib/iomgr/tcp_client_posix.cc +1 -1
  123. data/src/core/lib/iomgr/tcp_posix.cc +3 -3
  124. data/src/core/lib/promise/activity.h +2 -2
  125. data/src/core/lib/promise/mpsc.cc +8 -8
  126. data/src/core/lib/promise/party.cc +7 -7
  127. data/src/core/lib/promise/party.h +4 -4
  128. data/src/core/lib/promise/poll.h +10 -0
  129. data/src/core/lib/resource_quota/memory_quota.cc +90 -3
  130. data/src/core/lib/resource_quota/memory_quota.h +20 -9
  131. data/src/core/lib/resource_quota/periodic_update.cc +14 -0
  132. data/src/core/lib/resource_quota/periodic_update.h +8 -0
  133. data/src/core/lib/resource_quota/resource_quota.cc +15 -4
  134. data/src/core/lib/resource_quota/resource_quota.h +3 -0
  135. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +1 -2
  136. data/src/core/lib/surface/call.cc +5 -5
  137. data/src/core/lib/surface/call.h +6 -5
  138. data/src/core/lib/surface/completion_queue.cc +2 -4
  139. data/src/core/lib/surface/filter_stack_call.cc +1 -1
  140. data/src/core/lib/surface/version.cc +2 -2
  141. data/src/core/lib/transport/promise_endpoint.cc +2 -2
  142. data/src/core/lib/transport/promise_endpoint.h +3 -3
  143. data/src/core/load_balancing/endpoint_list.cc +29 -2
  144. data/src/core/load_balancing/grpclb/client_load_reporting_filter.cc +3 -3
  145. data/src/core/load_balancing/grpclb/client_load_reporting_filter.h +1 -1
  146. data/src/core/load_balancing/pick_first/pick_first.cc +12 -5
  147. data/src/core/load_balancing/xds/xds_cluster_impl.cc +5 -3
  148. data/src/core/net/socket_mutator.cc +19 -0
  149. data/src/core/net/socket_mutator.h +25 -0
  150. data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -0
  151. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver.h +6 -1
  152. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +2 -1
  153. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +8 -5
  154. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +2 -1
  155. data/src/core/resolver/xds/xds_dependency_manager.cc +1 -1
  156. data/src/core/server/server.cc +1 -1
  157. data/src/core/server/server_call_tracer_filter.cc +0 -66
  158. data/src/core/server/server_call_tracer_filter.h +64 -0
  159. data/src/core/server/server_config_selector_filter.cc +1 -1
  160. data/src/core/service_config/service_config_channel_arg_filter.cc +3 -60
  161. data/src/core/service_config/service_config_channel_arg_filter.h +82 -0
  162. data/src/core/telemetry/call_tracer.cc +20 -14
  163. data/src/core/telemetry/call_tracer.h +22 -17
  164. data/src/core/telemetry/metrics.h +8 -8
  165. data/src/core/telemetry/stats_data.cc +151 -151
  166. data/src/core/telemetry/stats_data.h +87 -87
  167. data/src/core/transport/auth_context.cc +20 -0
  168. data/src/core/transport/auth_context.h +4 -0
  169. data/src/core/transport/auth_context_comparator_registry.h +69 -0
  170. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +2 -3
  171. data/src/core/tsi/ssl_transport_security.cc +202 -32
  172. data/src/core/tsi/ssl_transport_security.h +19 -10
  173. data/src/core/tsi/ssl_transport_security_utils.cc +21 -0
  174. data/src/core/tsi/ssl_transport_security_utils.h +4 -0
  175. data/src/core/util/http_client/httpcli_security_connector.cc +3 -1
  176. data/src/core/util/latent_see.cc +178 -146
  177. data/src/core/util/latent_see.h +245 -188
  178. data/src/core/util/single_set_ptr.h +5 -2
  179. data/src/core/util/useful.h +91 -0
  180. data/src/core/util/windows/directory_reader.cc +1 -0
  181. data/src/core/util/windows/thd.cc +1 -3
  182. data/src/core/util/work_serializer.cc +1 -1
  183. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +32 -5
  184. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.h +5 -0
  185. data/src/core/xds/grpc/xds_certificate_provider.cc +5 -6
  186. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  187. data/src/ruby/lib/grpc/version.rb +1 -1
  188. data/third_party/cares/cares/include/ares.h +925 -460
  189. data/third_party/cares/cares/include/ares_dns.h +86 -71
  190. data/third_party/cares/cares/include/ares_dns_record.h +1118 -0
  191. data/third_party/cares/cares/include/ares_nameser.h +215 -189
  192. data/third_party/cares/cares/include/ares_version.h +37 -14
  193. data/third_party/cares/cares/src/lib/ares_addrinfo2hostent.c +305 -0
  194. data/third_party/cares/cares/src/lib/ares_addrinfo_localhost.c +245 -0
  195. data/third_party/cares/cares/src/lib/ares_android.c +216 -164
  196. data/third_party/cares/cares/src/lib/ares_android.h +25 -14
  197. data/third_party/cares/cares/src/lib/ares_cancel.c +68 -44
  198. data/third_party/cares/cares/src/lib/ares_close_sockets.c +137 -0
  199. data/third_party/cares/cares/src/lib/ares_conn.c +511 -0
  200. data/third_party/cares/cares/src/lib/ares_conn.h +196 -0
  201. data/third_party/cares/cares/src/lib/ares_cookie.c +461 -0
  202. data/third_party/cares/cares/src/lib/ares_data.c +93 -181
  203. data/third_party/cares/cares/src/lib/ares_data.h +50 -39
  204. data/third_party/cares/cares/src/lib/ares_destroy.c +127 -89
  205. data/third_party/cares/cares/src/lib/ares_free_hostent.c +35 -24
  206. data/third_party/cares/cares/src/lib/ares_free_string.c +24 -16
  207. data/third_party/cares/cares/src/lib/ares_freeaddrinfo.c +45 -38
  208. data/third_party/cares/cares/src/lib/ares_getaddrinfo.c +549 -663
  209. data/third_party/cares/cares/src/lib/ares_getenv.c +25 -15
  210. data/third_party/cares/cares/src/lib/ares_getenv.h +26 -18
  211. data/third_party/cares/cares/src/lib/ares_gethostbyaddr.c +163 -221
  212. data/third_party/cares/cares/src/lib/ares_gethostbyname.c +222 -223
  213. data/third_party/cares/cares/src/lib/ares_getnameinfo.c +328 -338
  214. data/third_party/cares/cares/src/lib/ares_hosts_file.c +952 -0
  215. data/third_party/cares/cares/src/lib/ares_inet_net_pton.h +25 -19
  216. data/third_party/cares/cares/src/lib/ares_init.c +425 -2091
  217. data/third_party/cares/cares/src/lib/ares_ipv6.h +63 -33
  218. data/third_party/cares/cares/src/lib/ares_library_init.c +110 -54
  219. data/third_party/cares/cares/src/lib/ares_metrics.c +261 -0
  220. data/third_party/cares/cares/src/lib/ares_options.c +418 -332
  221. data/third_party/cares/cares/src/lib/ares_parse_into_addrinfo.c +179 -0
  222. data/third_party/cares/cares/src/lib/ares_private.h +558 -356
  223. data/third_party/cares/cares/src/lib/ares_process.c +1224 -1369
  224. data/third_party/cares/cares/src/lib/ares_qcache.c +430 -0
  225. data/third_party/cares/cares/src/lib/ares_query.c +126 -121
  226. data/third_party/cares/cares/src/lib/ares_search.c +564 -262
  227. data/third_party/cares/cares/src/lib/ares_send.c +264 -93
  228. data/third_party/cares/cares/src/lib/ares_set_socket_functions.c +588 -0
  229. data/third_party/cares/cares/src/lib/ares_setup.h +115 -111
  230. data/third_party/cares/cares/src/lib/ares_socket.c +425 -0
  231. data/third_party/cares/cares/src/lib/ares_socket.h +163 -0
  232. data/third_party/cares/cares/src/lib/ares_sortaddrinfo.c +447 -0
  233. data/third_party/cares/cares/src/lib/ares_strerror.c +83 -48
  234. data/third_party/cares/cares/src/lib/ares_sysconfig.c +639 -0
  235. data/third_party/cares/cares/src/lib/ares_sysconfig_files.c +839 -0
  236. data/third_party/cares/cares/src/lib/ares_sysconfig_mac.c +373 -0
  237. data/third_party/cares/cares/src/lib/ares_sysconfig_win.c +621 -0
  238. data/third_party/cares/cares/src/lib/ares_timeout.c +136 -73
  239. data/third_party/cares/cares/src/lib/ares_update_servers.c +1362 -0
  240. data/third_party/cares/cares/src/lib/ares_version.c +29 -4
  241. data/third_party/cares/cares/src/lib/config-dos.h +88 -89
  242. data/third_party/cares/cares/src/lib/config-win32.h +122 -77
  243. data/third_party/cares/cares/src/lib/dsa/ares_array.c +394 -0
  244. data/third_party/cares/cares/src/lib/dsa/ares_htable.c +447 -0
  245. data/third_party/cares/cares/src/lib/dsa/ares_htable.h +174 -0
  246. data/third_party/cares/cares/src/lib/dsa/ares_htable_asvp.c +224 -0
  247. data/third_party/cares/cares/src/lib/dsa/ares_htable_dict.c +228 -0
  248. data/third_party/cares/cares/src/lib/dsa/ares_htable_strvp.c +210 -0
  249. data/third_party/cares/cares/src/lib/dsa/ares_htable_szvp.c +188 -0
  250. data/third_party/cares/cares/src/lib/dsa/ares_htable_vpstr.c +186 -0
  251. data/third_party/cares/cares/src/lib/dsa/ares_htable_vpvp.c +194 -0
  252. data/third_party/cares/cares/src/lib/dsa/ares_llist.c +382 -0
  253. data/third_party/cares/cares/src/lib/dsa/ares_slist.c +479 -0
  254. data/third_party/cares/cares/src/lib/dsa/ares_slist.h +207 -0
  255. data/third_party/cares/cares/src/lib/event/ares_event.h +191 -0
  256. data/third_party/cares/cares/src/lib/event/ares_event_configchg.c +743 -0
  257. data/third_party/cares/cares/src/lib/event/ares_event_epoll.c +192 -0
  258. data/third_party/cares/cares/src/lib/event/ares_event_kqueue.c +248 -0
  259. data/third_party/cares/cares/src/lib/event/ares_event_poll.c +140 -0
  260. data/third_party/cares/cares/src/lib/event/ares_event_select.c +159 -0
  261. data/third_party/cares/cares/src/lib/event/ares_event_thread.c +567 -0
  262. data/third_party/cares/cares/src/lib/event/ares_event_wake_pipe.c +166 -0
  263. data/third_party/cares/cares/src/lib/event/ares_event_win32.c +978 -0
  264. data/third_party/cares/cares/src/lib/event/ares_event_win32.h +161 -0
  265. data/third_party/cares/cares/src/lib/include/ares_array.h +276 -0
  266. data/third_party/cares/cares/src/lib/include/ares_buf.h +732 -0
  267. data/third_party/cares/cares/src/lib/include/ares_htable_asvp.h +130 -0
  268. data/third_party/cares/cares/src/lib/include/ares_htable_dict.h +123 -0
  269. data/third_party/cares/cares/src/lib/include/ares_htable_strvp.h +130 -0
  270. data/third_party/cares/cares/src/lib/include/ares_htable_szvp.h +118 -0
  271. data/third_party/cares/cares/src/lib/include/ares_htable_vpstr.h +111 -0
  272. data/third_party/cares/cares/src/lib/include/ares_htable_vpvp.h +128 -0
  273. data/third_party/cares/cares/src/lib/include/ares_llist.h +239 -0
  274. data/third_party/cares/cares/src/lib/include/ares_mem.h +38 -0
  275. data/third_party/cares/cares/src/lib/include/ares_str.h +244 -0
  276. data/third_party/cares/cares/src/lib/inet_net_pton.c +202 -157
  277. data/third_party/cares/cares/src/lib/inet_ntop.c +87 -69
  278. data/third_party/cares/cares/src/lib/legacy/ares_create_query.c +78 -0
  279. data/third_party/cares/cares/src/lib/legacy/ares_expand_name.c +99 -0
  280. data/third_party/cares/cares/src/lib/legacy/ares_expand_string.c +107 -0
  281. data/third_party/cares/cares/src/lib/legacy/ares_fds.c +80 -0
  282. data/third_party/cares/cares/src/lib/legacy/ares_getsock.c +85 -0
  283. data/third_party/cares/cares/src/lib/legacy/ares_parse_a_reply.c +107 -0
  284. data/third_party/cares/cares/src/lib/legacy/ares_parse_aaaa_reply.c +109 -0
  285. data/third_party/cares/cares/src/lib/legacy/ares_parse_caa_reply.c +137 -0
  286. data/third_party/cares/cares/src/lib/legacy/ares_parse_mx_reply.c +110 -0
  287. data/third_party/cares/cares/src/lib/legacy/ares_parse_naptr_reply.c +132 -0
  288. data/third_party/cares/cares/src/lib/legacy/ares_parse_ns_reply.c +154 -0
  289. data/third_party/cares/cares/src/lib/legacy/ares_parse_ptr_reply.c +213 -0
  290. data/third_party/cares/cares/src/lib/legacy/ares_parse_soa_reply.c +115 -0
  291. data/third_party/cares/cares/src/lib/legacy/ares_parse_srv_reply.c +114 -0
  292. data/third_party/cares/cares/src/lib/legacy/ares_parse_txt_reply.c +144 -0
  293. data/third_party/cares/cares/src/lib/legacy/ares_parse_uri_reply.c +113 -0
  294. data/third_party/cares/cares/src/lib/record/ares_dns_mapping.c +982 -0
  295. data/third_party/cares/cares/src/lib/record/ares_dns_multistring.c +307 -0
  296. data/third_party/cares/cares/src/lib/record/ares_dns_multistring.h +72 -0
  297. data/third_party/cares/cares/src/lib/record/ares_dns_name.c +673 -0
  298. data/third_party/cares/cares/src/lib/record/ares_dns_parse.c +1329 -0
  299. data/third_party/cares/cares/src/lib/record/ares_dns_private.h +273 -0
  300. data/third_party/cares/cares/src/lib/record/ares_dns_record.c +1661 -0
  301. data/third_party/cares/cares/src/lib/record/ares_dns_write.c +1229 -0
  302. data/third_party/cares/cares/src/lib/str/ares_buf.c +1498 -0
  303. data/third_party/cares/cares/src/lib/str/ares_str.c +508 -0
  304. data/third_party/cares/cares/src/lib/str/ares_strsplit.c +90 -0
  305. data/third_party/cares/cares/src/lib/str/ares_strsplit.h +51 -0
  306. data/third_party/cares/cares/src/lib/thirdparty/apple/dnsinfo.h +122 -0
  307. data/third_party/cares/cares/src/lib/util/ares_iface_ips.c +628 -0
  308. data/third_party/cares/cares/src/lib/util/ares_iface_ips.h +139 -0
  309. data/third_party/cares/cares/src/lib/util/ares_math.c +158 -0
  310. data/third_party/cares/cares/src/lib/util/ares_math.h +45 -0
  311. data/third_party/cares/cares/src/lib/util/ares_rand.c +389 -0
  312. data/third_party/cares/cares/src/lib/util/ares_rand.h +36 -0
  313. data/third_party/cares/cares/src/lib/util/ares_threads.c +614 -0
  314. data/third_party/cares/cares/src/lib/util/ares_threads.h +60 -0
  315. data/third_party/cares/cares/src/lib/util/ares_time.h +48 -0
  316. data/third_party/cares/cares/src/lib/util/ares_timeval.c +95 -0
  317. data/third_party/cares/cares/src/lib/util/ares_uri.c +1626 -0
  318. data/third_party/cares/cares/src/lib/util/ares_uri.h +252 -0
  319. data/third_party/cares/cares/src/lib/windows_port.c +16 -9
  320. metadata +121 -49
  321. data/src/core/util/ring_buffer.h +0 -122
  322. data/third_party/cares/cares/include/ares_rules.h +0 -125
  323. data/third_party/cares/cares/src/lib/ares__addrinfo2hostent.c +0 -266
  324. data/third_party/cares/cares/src/lib/ares__addrinfo_localhost.c +0 -240
  325. data/third_party/cares/cares/src/lib/ares__close_sockets.c +0 -61
  326. data/third_party/cares/cares/src/lib/ares__get_hostent.c +0 -260
  327. data/third_party/cares/cares/src/lib/ares__parse_into_addrinfo.c +0 -229
  328. data/third_party/cares/cares/src/lib/ares__read_line.c +0 -73
  329. data/third_party/cares/cares/src/lib/ares__readaddrinfo.c +0 -258
  330. data/third_party/cares/cares/src/lib/ares__sortaddrinfo.c +0 -507
  331. data/third_party/cares/cares/src/lib/ares__timeval.c +0 -111
  332. data/third_party/cares/cares/src/lib/ares_create_query.c +0 -197
  333. data/third_party/cares/cares/src/lib/ares_expand_name.c +0 -311
  334. data/third_party/cares/cares/src/lib/ares_expand_string.c +0 -67
  335. data/third_party/cares/cares/src/lib/ares_fds.c +0 -59
  336. data/third_party/cares/cares/src/lib/ares_getsock.c +0 -66
  337. data/third_party/cares/cares/src/lib/ares_iphlpapi.h +0 -221
  338. data/third_party/cares/cares/src/lib/ares_llist.c +0 -63
  339. data/third_party/cares/cares/src/lib/ares_llist.h +0 -39
  340. data/third_party/cares/cares/src/lib/ares_mkquery.c +0 -24
  341. data/third_party/cares/cares/src/lib/ares_nowarn.c +0 -260
  342. data/third_party/cares/cares/src/lib/ares_nowarn.h +0 -61
  343. data/third_party/cares/cares/src/lib/ares_parse_a_reply.c +0 -90
  344. data/third_party/cares/cares/src/lib/ares_parse_aaaa_reply.c +0 -92
  345. data/third_party/cares/cares/src/lib/ares_parse_caa_reply.c +0 -199
  346. data/third_party/cares/cares/src/lib/ares_parse_mx_reply.c +0 -164
  347. data/third_party/cares/cares/src/lib/ares_parse_naptr_reply.c +0 -183
  348. data/third_party/cares/cares/src/lib/ares_parse_ns_reply.c +0 -177
  349. data/third_party/cares/cares/src/lib/ares_parse_ptr_reply.c +0 -228
  350. data/third_party/cares/cares/src/lib/ares_parse_soa_reply.c +0 -179
  351. data/third_party/cares/cares/src/lib/ares_parse_srv_reply.c +0 -168
  352. data/third_party/cares/cares/src/lib/ares_parse_txt_reply.c +0 -214
  353. data/third_party/cares/cares/src/lib/ares_parse_uri_reply.c +0 -184
  354. data/third_party/cares/cares/src/lib/ares_platform.c +0 -11042
  355. data/third_party/cares/cares/src/lib/ares_platform.h +0 -43
  356. data/third_party/cares/cares/src/lib/ares_rand.c +0 -279
  357. data/third_party/cares/cares/src/lib/ares_strcasecmp.c +0 -66
  358. data/third_party/cares/cares/src/lib/ares_strcasecmp.h +0 -30
  359. data/third_party/cares/cares/src/lib/ares_strdup.c +0 -42
  360. data/third_party/cares/cares/src/lib/ares_strdup.h +0 -24
  361. data/third_party/cares/cares/src/lib/ares_strsplit.c +0 -94
  362. data/third_party/cares/cares/src/lib/ares_strsplit.h +0 -42
  363. data/third_party/cares/cares/src/lib/ares_writev.c +0 -79
  364. data/third_party/cares/cares/src/lib/ares_writev.h +0 -36
  365. data/third_party/cares/cares/src/lib/bitncmp.c +0 -59
  366. data/third_party/cares/cares/src/lib/bitncmp.h +0 -26
  367. data/third_party/cares/cares/src/lib/setup_once.h +0 -554
  368. 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
+ }