grpc 1.19.0 → 1.20.0.pre1

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

Potentially problematic release.


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

Files changed (224) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +4131 -7903
  3. data/include/grpc/grpc.h +11 -6
  4. data/include/grpc/grpc_security.h +51 -9
  5. data/include/grpc/impl/codegen/byte_buffer.h +13 -0
  6. data/include/grpc/impl/codegen/grpc_types.h +4 -0
  7. data/include/grpc/impl/codegen/port_platform.h +37 -6
  8. data/include/grpc/impl/codegen/sync_posix.h +18 -0
  9. data/src/core/ext/filters/client_channel/client_channel.cc +560 -236
  10. data/src/core/ext/filters/client_channel/client_channel_channelz.h +2 -2
  11. data/src/core/ext/filters/client_channel/client_channel_factory.cc +22 -34
  12. data/src/core/ext/filters/client_channel/client_channel_factory.h +19 -38
  13. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +7 -4
  14. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +2 -2
  15. data/src/core/ext/filters/client_channel/lb_policy.cc +105 -28
  16. data/src/core/ext/filters/client_channel/lb_policy.h +259 -141
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +29 -32
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +789 -803
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +3 -1
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +2 -6
  21. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +1 -1
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +7 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +8 -8
  24. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +2 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +127 -219
  26. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +103 -282
  27. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +4 -10
  28. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +709 -906
  29. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc +0 -43
  30. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.cc +8 -8
  31. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.h +2 -2
  32. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -6
  33. data/src/core/ext/filters/client_channel/resolver.cc +54 -1
  34. data/src/core/ext/filters/client_channel/resolver.h +51 -22
  35. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +34 -86
  36. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +29 -41
  37. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +32 -78
  38. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +109 -72
  39. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +13 -8
  40. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +28 -63
  41. data/src/core/ext/filters/client_channel/resolver_factory.h +3 -1
  42. data/src/core/ext/filters/client_channel/resolver_registry.cc +5 -2
  43. data/src/core/ext/filters/client_channel/resolver_registry.h +5 -4
  44. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +69 -49
  45. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +11 -8
  46. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +568 -0
  47. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +141 -0
  48. data/src/core/ext/filters/client_channel/server_address.cc +0 -48
  49. data/src/core/ext/filters/client_channel/server_address.h +0 -10
  50. data/src/core/{lib/transport → ext/filters/client_channel}/service_config.cc +10 -5
  51. data/src/core/{lib/transport → ext/filters/client_channel}/service_config.h +16 -12
  52. data/src/core/ext/filters/client_channel/subchannel.cc +11 -16
  53. data/src/core/ext/filters/client_channel/subchannel.h +3 -0
  54. data/src/core/ext/filters/max_age/max_age_filter.cc +4 -1
  55. data/src/core/ext/filters/message_size/message_size_filter.cc +2 -2
  56. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +45 -45
  57. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +133 -134
  58. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +4 -4
  59. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +4 -4
  60. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +7 -6
  61. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +4 -3
  62. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +37 -29
  63. data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -1
  64. data/src/core/ext/transport/chttp2/transport/frame_data.cc +2 -1
  65. data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
  66. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +6 -5
  67. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -2
  68. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -4
  69. data/src/core/ext/transport/chttp2/transport/frame_ping.h +1 -1
  70. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +5 -4
  71. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -1
  72. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -1
  73. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -1
  74. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -4
  75. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +1 -1
  76. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +7 -6
  77. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +3 -2
  78. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +9 -5
  79. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +6 -1
  80. data/src/core/ext/transport/chttp2/transport/internal.h +5 -4
  81. data/src/core/ext/transport/chttp2/transport/parsing.cc +9 -9
  82. data/src/core/ext/transport/chttp2/transport/writing.cc +1 -1
  83. data/src/core/ext/transport/inproc/inproc_transport.cc +8 -0
  84. data/src/core/lib/channel/channel_args.cc +2 -0
  85. data/src/core/lib/channel/channel_args.h +3 -0
  86. data/src/core/lib/channel/channel_stack.h +1 -1
  87. data/src/core/lib/channel/channel_trace.cc +4 -4
  88. data/src/core/lib/channel/channel_trace.h +4 -4
  89. data/src/core/lib/channel/channelz.cc +32 -19
  90. data/src/core/lib/channel/channelz.h +4 -4
  91. data/src/core/lib/channel/channelz_registry.cc +1 -1
  92. data/src/core/lib/channel/context.h +0 -3
  93. data/src/core/lib/channel/handshaker_registry.cc +7 -3
  94. data/src/core/lib/compression/algorithm_metadata.h +3 -3
  95. data/src/core/lib/compression/compression.cc +1 -1
  96. data/src/core/lib/compression/compression_internal.cc +2 -2
  97. data/src/core/lib/compression/stream_compression_gzip.cc +1 -1
  98. data/src/core/lib/debug/trace.h +2 -1
  99. data/src/core/lib/gpr/cpu_posix.cc +5 -3
  100. data/src/core/lib/gpr/sync_posix.cc +65 -4
  101. data/src/core/lib/gprpp/atomic.h +75 -5
  102. data/src/core/lib/gprpp/fork.cc +0 -2
  103. data/src/core/lib/gprpp/orphanable.h +3 -2
  104. data/src/core/lib/gprpp/ref_counted.h +9 -11
  105. data/src/core/lib/gprpp/thd.h +42 -7
  106. data/src/core/lib/gprpp/thd_posix.cc +31 -13
  107. data/src/core/lib/gprpp/thd_windows.cc +47 -34
  108. data/src/core/lib/http/httpcli.cc +3 -2
  109. data/src/core/lib/http/httpcli_security_connector.cc +0 -1
  110. data/src/core/lib/http/parser.cc +2 -1
  111. data/src/core/lib/http/parser.h +2 -1
  112. data/src/core/lib/iomgr/buffer_list.h +1 -1
  113. data/src/core/lib/iomgr/endpoint.cc +2 -2
  114. data/src/core/lib/iomgr/endpoint.h +3 -2
  115. data/src/core/lib/iomgr/error.cc +9 -9
  116. data/src/core/lib/iomgr/error.h +4 -3
  117. data/src/core/lib/iomgr/ev_epoll1_linux.cc +6 -0
  118. data/src/core/lib/iomgr/ev_epollex_linux.cc +14 -9
  119. data/src/core/lib/iomgr/ev_poll_posix.cc +7 -481
  120. data/src/core/lib/iomgr/ev_posix.cc +7 -3
  121. data/src/core/lib/iomgr/ev_posix.h +8 -0
  122. data/src/core/lib/iomgr/executor.cc +13 -0
  123. data/src/core/lib/iomgr/executor.h +2 -1
  124. data/src/core/lib/iomgr/internal_errqueue.cc +2 -4
  125. data/src/core/lib/iomgr/iomgr.cc +5 -0
  126. data/src/core/lib/iomgr/iomgr.h +7 -0
  127. data/src/core/lib/iomgr/iomgr_custom.cc +9 -2
  128. data/src/core/lib/iomgr/iomgr_internal.cc +6 -0
  129. data/src/core/lib/iomgr/iomgr_internal.h +9 -1
  130. data/src/core/lib/iomgr/iomgr_posix.cc +10 -2
  131. data/src/core/lib/iomgr/iomgr_windows.cc +10 -2
  132. data/src/core/lib/iomgr/port.h +19 -0
  133. data/src/core/lib/iomgr/tcp_client_windows.cc +6 -4
  134. data/src/core/lib/iomgr/tcp_custom.cc +1 -1
  135. data/src/core/lib/iomgr/tcp_posix.cc +158 -54
  136. data/src/core/lib/iomgr/tcp_windows.cc +1 -1
  137. data/src/core/lib/iomgr/wakeup_fd_posix.cc +1 -19
  138. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +10 -6
  139. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -1
  140. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +3 -6
  141. data/src/core/lib/security/credentials/tls/spiffe_credentials.cc +129 -0
  142. data/src/core/lib/security/credentials/tls/spiffe_credentials.h +62 -0
  143. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +7 -2
  144. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +28 -17
  145. data/src/core/lib/security/security_connector/ssl_utils.cc +134 -0
  146. data/src/core/lib/security/security_connector/ssl_utils.h +32 -0
  147. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +426 -0
  148. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +122 -0
  149. data/src/core/lib/security/transport/auth_filters.h +2 -2
  150. data/src/core/lib/security/transport/client_auth_filter.cc +35 -39
  151. data/src/core/lib/security/transport/secure_endpoint.cc +2 -2
  152. data/src/core/lib/security/transport/security_handshaker.cc +4 -3
  153. data/src/core/lib/slice/percent_encoding.cc +3 -3
  154. data/src/core/lib/slice/percent_encoding.h +3 -3
  155. data/src/core/lib/slice/slice.cc +27 -30
  156. data/src/core/lib/slice/slice_hash_table.h +2 -2
  157. data/src/core/lib/slice/slice_intern.cc +1 -1
  158. data/src/core/lib/slice/slice_internal.h +14 -3
  159. data/src/core/lib/slice/slice_weak_hash_table.h +4 -4
  160. data/src/core/lib/surface/byte_buffer_reader.cc +17 -0
  161. data/src/core/lib/surface/call.cc +8 -3
  162. data/src/core/lib/surface/completion_queue.cc +134 -148
  163. data/src/core/lib/surface/init.cc +78 -30
  164. data/src/core/lib/surface/init.h +1 -0
  165. data/src/core/lib/surface/lame_client.cc +4 -6
  166. data/src/core/lib/surface/version.cc +1 -1
  167. data/src/core/lib/transport/metadata.cc +66 -33
  168. data/src/core/lib/transport/metadata_batch.cc +1 -1
  169. data/src/core/lib/transport/metadata_batch.h +1 -1
  170. data/src/core/lib/transport/timeout_encoding.cc +1 -1
  171. data/src/core/lib/transport/timeout_encoding.h +1 -1
  172. data/src/core/lib/transport/transport.h +4 -3
  173. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +3 -3
  174. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -1
  175. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +4 -3
  176. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +1 -1
  177. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +1 -1
  178. data/src/core/tsi/ssl_transport_security.cc +1 -5
  179. data/src/core/tsi/ssl_transport_security.h +24 -4
  180. data/src/ruby/bin/math_pb.rb +18 -16
  181. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  182. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  183. data/src/ruby/lib/grpc/generic/rpc_server.rb +1 -1
  184. data/src/ruby/lib/grpc/version.rb +1 -1
  185. data/src/ruby/pb/README.md +1 -1
  186. data/src/ruby/pb/grpc/health/v1/health_pb.rb +13 -10
  187. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +18 -0
  188. data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +3 -1
  189. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +58 -56
  190. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -0
  191. data/third_party/cares/cares/ares.h +12 -0
  192. data/third_party/cares/cares/ares_create_query.c +5 -1
  193. data/third_party/cares/cares/ares_data.c +74 -73
  194. data/third_party/cares/cares/ares_destroy.c +6 -1
  195. data/third_party/cares/cares/ares_gethostbyaddr.c +5 -5
  196. data/third_party/cares/cares/ares_gethostbyname.c +15 -4
  197. data/third_party/cares/cares/ares_getnameinfo.c +11 -0
  198. data/third_party/cares/cares/ares_init.c +274 -173
  199. data/third_party/cares/cares/ares_library_init.c +21 -3
  200. data/third_party/cares/cares/ares_options.c +6 -2
  201. data/third_party/cares/cares/ares_parse_naptr_reply.c +7 -6
  202. data/third_party/cares/cares/ares_parse_ptr_reply.c +4 -2
  203. data/third_party/cares/cares/ares_platform.c +7 -0
  204. data/third_party/cares/cares/ares_private.h +19 -11
  205. data/third_party/cares/cares/ares_process.c +27 -2
  206. data/third_party/cares/cares/ares_rules.h +1 -1
  207. data/third_party/cares/cares/ares_search.c +7 -0
  208. data/third_party/cares/cares/ares_send.c +6 -0
  209. data/third_party/cares/cares/ares_strsplit.c +174 -0
  210. data/third_party/cares/cares/ares_strsplit.h +43 -0
  211. data/third_party/cares/cares/ares_version.h +4 -4
  212. data/third_party/cares/cares/config-win32.h +1 -1
  213. data/third_party/cares/cares/inet_ntop.c +2 -3
  214. data/third_party/cares/config_darwin/ares_config.h +3 -0
  215. data/third_party/cares/config_freebsd/ares_config.h +3 -0
  216. data/third_party/cares/config_linux/ares_config.h +3 -0
  217. data/third_party/cares/config_openbsd/ares_config.h +3 -0
  218. metadata +39 -37
  219. data/src/core/ext/filters/client_channel/request_routing.cc +0 -946
  220. data/src/core/ext/filters/client_channel/request_routing.h +0 -181
  221. data/src/core/lib/gprpp/atomic_with_atm.h +0 -57
  222. data/src/core/lib/gprpp/atomic_with_std.h +0 -35
  223. data/src/core/lib/iomgr/wakeup_fd_cv.cc +0 -107
  224. data/src/core/lib/iomgr/wakeup_fd_cv.h +0 -69
@@ -30,15 +30,29 @@ fpGetAdaptersAddresses_t ares_fpGetAdaptersAddresses = ZERO_NULL;
30
30
  fpGetBestRoute2_t ares_fpGetBestRoute2 = ZERO_NULL;
31
31
  #endif
32
32
 
33
+ #if defined(ANDROID) || defined(__ANDROID__)
34
+ #include "ares_android.h"
35
+ #endif
36
+
33
37
  /* library-private global vars with source visibility restricted to this file */
34
38
 
35
39
  static unsigned int ares_initialized;
36
40
  static int ares_init_flags;
37
41
 
38
42
  /* library-private global vars with visibility across the whole library */
39
- void *(*ares_malloc)(size_t size) = malloc;
40
- void *(*ares_realloc)(void *ptr, size_t size) = realloc;
41
- void (*ares_free)(void *ptr) = free;
43
+ #if defined(WIN32)
44
+ /* We need indirections to handle Windows DLL rules. */
45
+ static void *default_malloc(size_t size) { return malloc(size); }
46
+ static void *default_realloc(void *p, size_t size) { return realloc(p, size); }
47
+ static void default_free(void *p) { free(p); }
48
+ #else
49
+ # define default_malloc malloc
50
+ # define default_realloc realloc
51
+ # define default_free free
52
+ #endif
53
+ void *(*ares_malloc)(size_t size) = default_malloc;
54
+ void *(*ares_realloc)(void *ptr, size_t size) = default_realloc;
55
+ void (*ares_free)(void *ptr) = default_free;
42
56
 
43
57
  #ifdef USE_WINSOCK
44
58
  static HMODULE hnd_iphlpapi;
@@ -160,6 +174,10 @@ void ares_library_cleanup(void)
160
174
  if (ares_init_flags & ARES_LIB_INIT_WIN32)
161
175
  ares_win32_cleanup();
162
176
 
177
+ #if defined(ANDROID) || defined(__ANDROID__)
178
+ ares_library_cleanup_android();
179
+ #endif
180
+
163
181
  ares_init_flags = ARES_LIB_INIT_NONE;
164
182
  ares_malloc = malloc;
165
183
  ares_realloc = realloc;
@@ -153,6 +153,9 @@ int ares_set_servers(ares_channel channel,
153
153
  if (!channel)
154
154
  return ARES_ENODATA;
155
155
 
156
+ if (!ares__is_list_empty(&channel->all_queries))
157
+ return ARES_ENOTIMP;
158
+
156
159
  ares__destroy_servers_state(channel);
157
160
 
158
161
  for (srvr = servers; srvr; srvr = srvr->next)
@@ -202,6 +205,9 @@ int ares_set_servers_ports(ares_channel channel,
202
205
  if (!channel)
203
206
  return ARES_ENODATA;
204
207
 
208
+ if (!ares__is_list_empty(&channel->all_queries))
209
+ return ARES_ENOTIMP;
210
+
205
211
  ares__destroy_servers_state(channel);
206
212
 
207
213
  for (srvr = servers; srvr; srvr = srvr->next)
@@ -258,8 +264,6 @@ static int set_servers_csv(ares_channel channel,
258
264
  if (!channel)
259
265
  return ARES_ENODATA;
260
266
 
261
- ares__destroy_servers_state(channel);
262
-
263
267
  i = strlen(_csv);
264
268
  if (i == 0)
265
269
  return ARES_SUCCESS; /* blank all servers */
@@ -110,18 +110,19 @@ ares_parse_naptr_reply (const unsigned char *abuf, int alen,
110
110
  status = ARES_EBADRESP;
111
111
  break;
112
112
  }
113
- /* RR must contain at least 7 bytes = 2 x int16 + 3 x name */
114
- if (rr_len < 7)
115
- {
116
- status = ARES_EBADRESP;
117
- break;
118
- }
119
113
 
120
114
  /* Check if we are really looking at a NAPTR record */
121
115
  if (rr_class == C_IN && rr_type == T_NAPTR)
122
116
  {
123
117
  /* parse the NAPTR record itself */
124
118
 
119
+ /* RR must contain at least 7 bytes = 2 x int16 + 3 x name */
120
+ if (rr_len < 7)
121
+ {
122
+ status = ARES_EBADRESP;
123
+ break;
124
+ }
125
+
125
126
  /* Allocate storage for this NAPTR answer appending it to the list */
126
127
  naptr_curr = ares_malloc_data(ARES_DATATYPE_NAPTR_REPLY);
127
128
  if (!naptr_curr)
@@ -52,6 +52,7 @@ int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr,
52
52
  int aliascnt = 0;
53
53
  int alias_alloc = 8;
54
54
  char ** aliases;
55
+ size_t rr_data_len;
55
56
 
56
57
  /* Set *host to NULL for all failure cases. */
57
58
  *host = NULL;
@@ -124,14 +125,15 @@ int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr,
124
125
  if (hostname)
125
126
  ares_free(hostname);
126
127
  hostname = rr_data;
127
- aliases[aliascnt] = ares_malloc((strlen(rr_data)+1) * sizeof(char));
128
+ rr_data_len = strlen(rr_data)+1;
129
+ aliases[aliascnt] = ares_malloc(rr_data_len * sizeof(char));
128
130
  if (!aliases[aliascnt])
129
131
  {
130
132
  ares_free(rr_name);
131
133
  status = ARES_ENOMEM;
132
134
  break;
133
135
  }
134
- strncpy(aliases[aliascnt], rr_data, strlen(rr_data)+1);
136
+ strncpy(aliases[aliascnt], rr_data, rr_data_len);
135
137
  aliascnt++;
136
138
  if (aliascnt >= alias_alloc) {
137
139
  char **ptr;
@@ -36,6 +36,10 @@ win_platform ares__getplatform(void)
36
36
 
37
37
  memset(&OsvEx, 0, sizeof(OsvEx));
38
38
  OsvEx.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
39
+ #ifdef _MSC_VER
40
+ #pragma warning(push)
41
+ #pragma warning(disable:4996) /* warning C4996: 'GetVersionExW': was declared deprecated */
42
+ #endif
39
43
  if (!GetVersionEx((void *)&OsvEx))
40
44
  {
41
45
  memset(&OsvEx, 0, sizeof(OsvEx));
@@ -43,6 +47,9 @@ win_platform ares__getplatform(void)
43
47
  if (!GetVersionEx((void *)&OsvEx))
44
48
  return WIN_UNKNOWN;
45
49
  }
50
+ #ifdef _MSC_VER
51
+ #pragma warning(pop)
52
+ #endif
46
53
 
47
54
  switch(OsvEx.dwPlatformId)
48
55
  {
@@ -52,18 +52,19 @@
52
52
 
53
53
  #if defined(WIN32) && !defined(WATT32)
54
54
 
55
- #define WIN_NS_9X "System\\CurrentControlSet\\Services\\VxD\\MSTCP"
56
- #define WIN_NS_NT_KEY "System\\CurrentControlSet\\Services\\Tcpip\\Parameters"
57
- #define WIN_DNSCLIENT "Software\\Policies\\Microsoft\\System\\DNSClient"
58
- #define NAMESERVER "NameServer"
59
- #define DHCPNAMESERVER "DhcpNameServer"
60
- #define DATABASEPATH "DatabasePath"
61
- #define WIN_PATH_HOSTS "\\hosts"
62
- #define SEARCHLIST_KEY "SearchList"
55
+ #define WIN_NS_9X "System\\CurrentControlSet\\Services\\VxD\\MSTCP"
56
+ #define WIN_NS_NT_KEY "System\\CurrentControlSet\\Services\\Tcpip\\Parameters"
57
+ #define WIN_DNSCLIENT "Software\\Policies\\Microsoft\\System\\DNSClient"
58
+ #define WIN_NT_DNSCLIENT "Software\\Policies\\Microsoft\\Windows NT\\DNSClient"
59
+ #define NAMESERVER "NameServer"
60
+ #define DHCPNAMESERVER "DhcpNameServer"
61
+ #define DATABASEPATH "DatabasePath"
62
+ #define WIN_PATH_HOSTS "\\hosts"
63
+ #define SEARCHLIST_KEY "SearchList"
63
64
  #define PRIMARYDNSSUFFIX_KEY "PrimaryDNSSuffix"
64
- #define INTERFACES_KEY "Interfaces"
65
- #define DOMAIN_KEY "Domain"
66
- #define DHCPDOMAIN_KEY "DhcpDomain"
65
+ #define INTERFACES_KEY "Interfaces"
66
+ #define DOMAIN_KEY "Domain"
67
+ #define DHCPDOMAIN_KEY "DhcpDomain"
67
68
 
68
69
  #elif defined(WATT32)
69
70
 
@@ -100,6 +101,7 @@
100
101
  #endif
101
102
 
102
103
  #include "ares_strdup.h"
104
+ #include "ares_strsplit.h"
103
105
 
104
106
  #ifndef HAVE_STRCASECMP
105
107
  # include "ares_strcasecmp.h"
@@ -323,8 +325,14 @@ struct ares_channeldata {
323
325
 
324
326
  const struct ares_socket_functions * sock_funcs;
325
327
  void *sock_func_cb_data;
328
+
329
+ /* Path for resolv.conf file, configurable via ares_options */
330
+ char *resolvconf_path;
326
331
  };
327
332
 
333
+ /* Does the domain end in ".onion" or ".onion."? Case-insensitive. */
334
+ int ares__is_onion_domain(const char *name);
335
+
328
336
  /* Memory management functions */
329
337
  extern void *(*ares_malloc)(size_t size);
330
338
  extern void *(*ares_realloc)(void *ptr, size_t size);
@@ -53,6 +53,7 @@
53
53
 
54
54
  #include <assert.h>
55
55
  #include <fcntl.h>
56
+ #include <limits.h>
56
57
 
57
58
  #include "ares.h"
58
59
  #include "ares_dns.h"
@@ -871,8 +872,32 @@ void ares__send_query(ares_channel channel, struct query *query,
871
872
  return;
872
873
  }
873
874
  }
874
- timeplus = channel->timeout << (query->try_count / channel->nservers);
875
- timeplus = (timeplus * (9 + (rand () & 7))) / 16;
875
+
876
+ /* For each trip through the entire server list, double the channel's
877
+ * assigned timeout, avoiding overflow. If channel->timeout is negative,
878
+ * leave it as-is, even though that should be impossible here.
879
+ */
880
+ timeplus = channel->timeout;
881
+ {
882
+ /* How many times do we want to double it? Presume sane values here. */
883
+ const int shift = query->try_count / channel->nservers;
884
+
885
+ /* Is there enough room to shift timeplus left that many times?
886
+ *
887
+ * To find out, confirm that all of the bits we'll shift away are zero.
888
+ * Stop considering a shift if we get to the point where we could shift
889
+ * a 1 into the sign bit (i.e. when shift is within two of the bit
890
+ * count).
891
+ *
892
+ * This has the side benefit of leaving negative numbers unchanged.
893
+ */
894
+ if(shift <= (int)(sizeof(int) * CHAR_BIT - 1)
895
+ && (timeplus >> (sizeof(int) * CHAR_BIT - 1 - shift)) == 0)
896
+ {
897
+ timeplus <<= shift;
898
+ }
899
+ }
900
+
876
901
  query->timeout = *now;
877
902
  timeadd(&query->timeout, timeplus);
878
903
  /* Keep track of queries bucketed by timeout, so we can process
@@ -83,7 +83,7 @@
83
83
 
84
84
  /*
85
85
  * Verify that the size previously defined and expected for
86
- * ares_socklen_t is actually the the same as the one reported
86
+ * ares_socklen_t is actually the same as the one reported
87
87
  * by sizeof() at compile time.
88
88
  */
89
89
 
@@ -54,6 +54,13 @@ void ares_search(ares_channel channel, const char *name, int dnsclass,
54
54
  const char *p;
55
55
  int status, ndots;
56
56
 
57
+ /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN. */
58
+ if (ares__is_onion_domain(name))
59
+ {
60
+ callback(arg, ARES_ENOTFOUND, 0, NULL, 0);
61
+ return;
62
+ }
63
+
57
64
  /* If name only yields one domain to search, then we don't have
58
65
  * to keep extra state, so just do an ares_query().
59
66
  */
@@ -60,6 +60,12 @@ void ares_send(ares_channel channel, const unsigned char *qbuf, int qlen,
60
60
  callback(arg, ARES_ENOMEM, 0, NULL, 0);
61
61
  return;
62
62
  }
63
+ if (channel->nservers < 1)
64
+ {
65
+ ares_free(query);
66
+ callback(arg, ARES_ESERVFAIL, 0, NULL, 0);
67
+ return;
68
+ }
63
69
  query->server_info = ares_malloc(channel->nservers *
64
70
  sizeof(query->server_info[0]));
65
71
  if (!query->server_info)
@@ -0,0 +1,174 @@
1
+ /* Copyright (C) 2018 by John Schember <john@nachtimwald.com>
2
+ *
3
+ * Permission to use, copy, modify, and distribute this
4
+ * software and its documentation for any purpose and without
5
+ * fee is hereby granted, provided that the above copyright
6
+ * notice appear in all copies and that both that copyright
7
+ * notice and this permission notice appear in supporting
8
+ * documentation, and that the name of M.I.T. not be used in
9
+ * advertising or publicity pertaining to distribution of the
10
+ * software without specific, written prior permission.
11
+ * M.I.T. makes no representations about the suitability of
12
+ * this software for any purpose. It is provided "as is"
13
+ * without express or implied warranty.
14
+ */
15
+
16
+ #include "ares_setup.h"
17
+ #include "ares_strsplit.h"
18
+ #include "ares.h"
19
+ #include "ares_private.h"
20
+
21
+ static int list_contains(char * const *list, size_t num_elem, const char *str, int insensitive)
22
+ {
23
+ size_t len;
24
+ size_t i;
25
+
26
+ len = strlen(str);
27
+ for (i=0; i<num_elem; i++)
28
+ {
29
+ if (insensitive)
30
+ {
31
+ #ifdef WIN32
32
+ if (strnicmp(list[i], str, len) == 0)
33
+ #else
34
+ if (strncasecmp(list[i], str, len) == 0)
35
+ #endif
36
+ return 1;
37
+ }
38
+ else
39
+ {
40
+ if (strncmp(list[i], str, len) == 0)
41
+ return 1;
42
+ }
43
+ }
44
+
45
+ return 0;
46
+ }
47
+
48
+ static int is_delim(char c, const char *delims, size_t num_delims)
49
+ {
50
+ size_t i;
51
+
52
+ for (i=0; i<num_delims; i++)
53
+ {
54
+ if (c == delims[i])
55
+ return 1;
56
+ }
57
+ return 0;
58
+ }
59
+
60
+
61
+ void ares_strsplit_free(char **elms, size_t num_elm)
62
+ {
63
+ size_t i;
64
+
65
+ if (elms == NULL)
66
+ return;
67
+
68
+ for (i=0; i<num_elm; i++)
69
+ ares_free(elms[i]);
70
+ ares_free(elms);
71
+ }
72
+
73
+
74
+ char **ares_strsplit(const char *in, const char *delms, int make_set, size_t *num_elm)
75
+ {
76
+ char *parsestr;
77
+ char **temp;
78
+ char **out;
79
+ size_t cnt;
80
+ size_t nelms;
81
+ size_t in_len;
82
+ size_t num_delims;
83
+ size_t i;
84
+
85
+ if (in == NULL || delms == NULL || num_elm == NULL)
86
+ return NULL;
87
+
88
+ *num_elm = 0;
89
+
90
+ in_len = strlen(in);
91
+ num_delims = strlen(delms);
92
+
93
+ /* Figure out how many elements. */
94
+ nelms = 1;
95
+ for (i=0; i<in_len; i++)
96
+ {
97
+ if (is_delim(in[i], delms, num_delims))
98
+ {
99
+ nelms++;
100
+ }
101
+ }
102
+
103
+ /* Copy of input so we can cut it up. */
104
+ parsestr = ares_strdup(in);
105
+ if (parsestr == NULL)
106
+ return NULL;
107
+
108
+ /* Temporary array to store locations of start of each element
109
+ * within parsestr. */
110
+ temp = ares_malloc(nelms * sizeof(*temp));
111
+ if (temp == NULL)
112
+ {
113
+ ares_free(parsestr);
114
+ return NULL;
115
+ }
116
+ temp[0] = parsestr;
117
+ cnt = 1;
118
+ for (i=0; i<in_len && cnt<nelms; i++)
119
+ {
120
+ if (!is_delim(parsestr[i], delms, num_delims))
121
+ continue;
122
+
123
+ /* Replace sep with NULL. */
124
+ parsestr[i] = '\0';
125
+ /* Add the pointer to the array of elements */
126
+ temp[cnt] = parsestr+i+1;
127
+ cnt++;
128
+ }
129
+
130
+ /* Copy each element to our output array. */
131
+ out = ares_malloc(nelms * sizeof(*out));
132
+ if (out == NULL)
133
+ {
134
+ ares_free(parsestr);
135
+ ares_free(temp);
136
+ return NULL;
137
+ }
138
+
139
+ nelms = 0;
140
+ for (i=0; i<cnt; i++)
141
+ {
142
+ if (temp[i][0] == '\0')
143
+ continue;
144
+
145
+ if (make_set && list_contains(out, nelms, temp[i], 1))
146
+ continue;
147
+
148
+ out[nelms] = ares_strdup(temp[i]);
149
+ if (out[nelms] == NULL)
150
+ {
151
+ ares_strsplit_free(out, nelms);
152
+ ares_free(parsestr);
153
+ ares_free(temp);
154
+ return NULL;
155
+ }
156
+ nelms++;
157
+ }
158
+
159
+
160
+ /* If there are no elements don't return an empty allocated
161
+ * array. */
162
+ if (nelms == 0)
163
+ {
164
+ ares_strsplit_free(out, nelms);
165
+ out = NULL;
166
+ }
167
+
168
+ /* Get the true number of elements (recalculated because of make_set) */
169
+ *num_elm = nelms;
170
+
171
+ ares_free(parsestr);
172
+ ares_free(temp);
173
+ return out;
174
+ }