annotate src/core/ngx_resolver.c @ 7286:d27aa9060c95

Stream: udp streams. Previously, only one client packet could be processed in a udp stream session even though multiple response packets were supported. Now multiple packets coming from the same client address and port are delivered to the same stream session. If it's required to maintain a single stream of data, nginx should be configured in a way that all packets from a client are delivered to the same worker. On Linux and DragonFly BSD the "reuseport" parameter should be specified for this. Other systems do not currently provide appropriate mechanisms. For these systems a single stream of udp packets is only guaranteed in single-worker configurations. The proxy_response directive now specifies how many packets are expected in response to a single client packet.
author Roman Arutyunyan <arut@nginx.com>
date Mon, 04 Jun 2018 19:50:00 +0300
parents a90f7812de35
children 91ea68dd1501
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 /*
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 4296
diff changeset
4 * Copyright (C) Nginx, Inc.
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5 */
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10 #include <ngx_event.h>
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
13 #define NGX_RESOLVER_UDP_SIZE 4096
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
14
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
15 #define NGX_RESOLVER_TCP_RSIZE (2 + 65535)
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
16 #define NGX_RESOLVER_TCP_WSIZE 8192
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
17
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
18
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
19 typedef struct {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
20 u_char ident_hi;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
21 u_char ident_lo;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
22 u_char flags_hi;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
23 u_char flags_lo;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
24 u_char nqs_hi;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
25 u_char nqs_lo;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
26 u_char nan_hi;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
27 u_char nan_lo;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
28 u_char nns_hi;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
29 u_char nns_lo;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
30 u_char nar_hi;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
31 u_char nar_lo;
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
32 } ngx_resolver_hdr_t;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
33
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
34
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
35 typedef struct {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
36 u_char type_hi;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
37 u_char type_lo;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
38 u_char class_hi;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
39 u_char class_lo;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
40 } ngx_resolver_qs_t;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
41
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
42
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
43 typedef struct {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
44 u_char type_hi;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
45 u_char type_lo;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
46 u_char class_hi;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
47 u_char class_lo;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
48 u_char ttl[4];
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
49 u_char len_hi;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
50 u_char len_lo;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
51 } ngx_resolver_an_t;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
52
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
53
5921
5004210e8c78 Resolver: fixed debug event logging.
Ruslan Ermilov <ru@nginx.com>
parents: 5920
diff changeset
54 #define ngx_resolver_node(n) \
5004210e8c78 Resolver: fixed debug event logging.
Ruslan Ermilov <ru@nginx.com>
parents: 5920
diff changeset
55 (ngx_resolver_node_t *) \
5004210e8c78 Resolver: fixed debug event logging.
Ruslan Ermilov <ru@nginx.com>
parents: 5920
diff changeset
56 ((u_char *) (n) - offsetof(ngx_resolver_node_t, node))
5004210e8c78 Resolver: fixed debug event logging.
Ruslan Ermilov <ru@nginx.com>
parents: 5920
diff changeset
57
5004210e8c78 Resolver: fixed debug event logging.
Ruslan Ermilov <ru@nginx.com>
parents: 5920
diff changeset
58
6922
a72886067bbb Added missing static specifiers.
Eran Kornblau <erankor@gmail.com>
parents: 6860
diff changeset
59 static ngx_int_t ngx_udp_connect(ngx_resolver_connection_t *rec);
a72886067bbb Added missing static specifiers.
Eran Kornblau <erankor@gmail.com>
parents: 6860
diff changeset
60 static ngx_int_t ngx_tcp_connect(ngx_resolver_connection_t *rec);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
61
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
62
1906
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
63 static void ngx_resolver_cleanup(void *data);
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
64 static void ngx_resolver_cleanup_tree(ngx_resolver_t *r, ngx_rbtree_t *tree);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
65 static ngx_int_t ngx_resolve_name_locked(ngx_resolver_t *r,
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
66 ngx_resolver_ctx_t *ctx, ngx_str_t *name);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
67 static void ngx_resolver_expire(ngx_resolver_t *r, ngx_rbtree_t *tree,
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
68 ngx_queue_t *queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
69 static ngx_int_t ngx_resolver_send_query(ngx_resolver_t *r,
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
70 ngx_resolver_node_t *rn);
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
71 static ngx_int_t ngx_resolver_send_udp_query(ngx_resolver_t *r,
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
72 ngx_resolver_connection_t *rec, u_char *query, u_short qlen);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
73 static ngx_int_t ngx_resolver_send_tcp_query(ngx_resolver_t *r,
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
74 ngx_resolver_connection_t *rec, u_char *query, u_short qlen);
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
75 static ngx_int_t ngx_resolver_create_name_query(ngx_resolver_t *r,
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
76 ngx_resolver_node_t *rn, ngx_str_t *name);
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
77 static ngx_int_t ngx_resolver_create_srv_query(ngx_resolver_t *r,
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
78 ngx_resolver_node_t *rn, ngx_str_t *name);
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
79 static ngx_int_t ngx_resolver_create_addr_query(ngx_resolver_t *r,
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
80 ngx_resolver_node_t *rn, ngx_resolver_addr_t *addr);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
81 static void ngx_resolver_resend_handler(ngx_event_t *ev);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
82 static time_t ngx_resolver_resend(ngx_resolver_t *r, ngx_rbtree_t *tree,
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
83 ngx_queue_t *queue);
6196
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
84 static ngx_uint_t ngx_resolver_resend_empty(ngx_resolver_t *r);
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
85 static void ngx_resolver_udp_read(ngx_event_t *rev);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
86 static void ngx_resolver_tcp_write(ngx_event_t *wev);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
87 static void ngx_resolver_tcp_read(ngx_event_t *rev);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
88 static void ngx_resolver_process_response(ngx_resolver_t *r, u_char *buf,
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
89 size_t n, ngx_uint_t tcp);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
90 static void ngx_resolver_process_a(ngx_resolver_t *r, u_char *buf, size_t n,
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
91 ngx_uint_t ident, ngx_uint_t code, ngx_uint_t qtype,
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
92 ngx_uint_t nan, ngx_uint_t trunc, ngx_uint_t ans);
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
93 static void ngx_resolver_process_srv(ngx_resolver_t *r, u_char *buf, size_t n,
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
94 ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan,
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
95 ngx_uint_t trunc, ngx_uint_t ans);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
96 static void ngx_resolver_process_ptr(ngx_resolver_t *r, u_char *buf, size_t n,
1742
268b81386fe4 no answers in DNS response should be NXDOMAIN
Igor Sysoev <igor@sysoev.ru>
parents: 1741
diff changeset
97 ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
98 static ngx_resolver_node_t *ngx_resolver_lookup_name(ngx_resolver_t *r,
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
99 ngx_str_t *name, uint32_t hash);
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
100 static ngx_resolver_node_t *ngx_resolver_lookup_srv(ngx_resolver_t *r,
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
101 ngx_str_t *name, uint32_t hash);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
102 static ngx_resolver_node_t *ngx_resolver_lookup_addr(ngx_resolver_t *r,
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
103 in_addr_t addr);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
104 static void ngx_resolver_rbtree_insert_value(ngx_rbtree_node_t *temp,
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
105 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
106 static ngx_int_t ngx_resolver_copy(ngx_resolver_t *r, ngx_str_t *name,
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
107 u_char *buf, u_char *src, u_char *last);
7051
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
108 static ngx_int_t ngx_resolver_set_timeout(ngx_resolver_t *r,
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
109 ngx_resolver_ctx_t *ctx);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
110 static void ngx_resolver_timeout_handler(ngx_event_t *ev);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
111 static void ngx_resolver_free_node(ngx_resolver_t *r, ngx_resolver_node_t *rn);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
112 static void *ngx_resolver_alloc(ngx_resolver_t *r, size_t size);
1903
1ea922585517 static ngx_resolver_calloc()
Igor Sysoev <igor@sysoev.ru>
parents: 1880
diff changeset
113 static void *ngx_resolver_calloc(ngx_resolver_t *r, size_t size);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
114 static void ngx_resolver_free(ngx_resolver_t *r, void *p);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
115 static void ngx_resolver_free_locked(ngx_resolver_t *r, void *p);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
116 static void *ngx_resolver_dup(ngx_resolver_t *r, void *src, size_t size);
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
117 static ngx_resolver_addr_t *ngx_resolver_export(ngx_resolver_t *r,
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
118 ngx_resolver_node_t *rn, ngx_uint_t rotate);
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
119 static void ngx_resolver_report_srv(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx);
3408
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
120 static u_char *ngx_resolver_log_error(ngx_log_t *log, u_char *buf, size_t len);
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
121 static void ngx_resolver_resolve_srv_names(ngx_resolver_ctx_t *ctx,
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
122 ngx_resolver_node_t *rn);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
123 static void ngx_resolver_srv_names_handler(ngx_resolver_ctx_t *ctx);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
124 static ngx_int_t ngx_resolver_cmp_srvs(const void *one, const void *two);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
125
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
126 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
127 static void ngx_resolver_rbtree_insert_addr6_value(ngx_rbtree_node_t *temp,
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
128 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
129 static ngx_resolver_node_t *ngx_resolver_lookup_addr6(ngx_resolver_t *r,
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
130 struct in6_addr *addr, uint32_t hash);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
131 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
132
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
133
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
134 ngx_resolver_t *
4225
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
135 ngx_resolver_create(ngx_conf_t *cf, ngx_str_t *names, ngx_uint_t n)
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
136 {
6365
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
137 ngx_str_t s;
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
138 ngx_url_t u;
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
139 ngx_uint_t i, j;
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
140 ngx_resolver_t *r;
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
141 ngx_pool_cleanup_t *cln;
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
142 ngx_resolver_connection_t *rec;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
143
1913
c0f873458e2b use cf->cycle->new_log because at merge stage cf->pool->log is old log
Igor Sysoev <igor@sysoev.ru>
parents: 1906
diff changeset
144 cln = ngx_pool_cleanup_add(cf->pool, 0);
1906
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
145 if (cln == NULL) {
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
146 return NULL;
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
147 }
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
148
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
149 cln->handler = ngx_resolver_cleanup;
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
150
1913
c0f873458e2b use cf->cycle->new_log because at merge stage cf->pool->log is old log
Igor Sysoev <igor@sysoev.ru>
parents: 1906
diff changeset
151 r = ngx_calloc(sizeof(ngx_resolver_t), cf->log);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
152 if (r == NULL) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
153 return NULL;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
154 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
155
1906
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
156 cln->data = r;
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
157
1913
c0f873458e2b use cf->cycle->new_log because at merge stage cf->pool->log is old log
Igor Sysoev <igor@sysoev.ru>
parents: 1906
diff changeset
158 r->event = ngx_calloc(sizeof(ngx_event_t), cf->log);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
159 if (r->event == NULL) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
160 return NULL;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
161 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
162
1687
568d432effb9 use ngx_rbtree_init()
Igor Sysoev <igor@sysoev.ru>
parents: 1685
diff changeset
163 ngx_rbtree_init(&r->name_rbtree, &r->name_sentinel,
568d432effb9 use ngx_rbtree_init()
Igor Sysoev <igor@sysoev.ru>
parents: 1685
diff changeset
164 ngx_resolver_rbtree_insert_value);
568d432effb9 use ngx_rbtree_init()
Igor Sysoev <igor@sysoev.ru>
parents: 1685
diff changeset
165
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
166 ngx_rbtree_init(&r->srv_rbtree, &r->srv_sentinel,
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
167 ngx_resolver_rbtree_insert_value);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
168
1687
568d432effb9 use ngx_rbtree_init()
Igor Sysoev <igor@sysoev.ru>
parents: 1685
diff changeset
169 ngx_rbtree_init(&r->addr_rbtree, &r->addr_sentinel,
568d432effb9 use ngx_rbtree_init()
Igor Sysoev <igor@sysoev.ru>
parents: 1685
diff changeset
170 ngx_rbtree_insert_value);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
171
1685
a24c909ad879 use ngx_queue_init()
Igor Sysoev <igor@sysoev.ru>
parents: 1683
diff changeset
172 ngx_queue_init(&r->name_resend_queue);
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
173 ngx_queue_init(&r->srv_resend_queue);
1685
a24c909ad879 use ngx_queue_init()
Igor Sysoev <igor@sysoev.ru>
parents: 1683
diff changeset
174 ngx_queue_init(&r->addr_resend_queue);
a24c909ad879 use ngx_queue_init()
Igor Sysoev <igor@sysoev.ru>
parents: 1683
diff changeset
175
a24c909ad879 use ngx_queue_init()
Igor Sysoev <igor@sysoev.ru>
parents: 1683
diff changeset
176 ngx_queue_init(&r->name_expire_queue);
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
177 ngx_queue_init(&r->srv_expire_queue);
1685
a24c909ad879 use ngx_queue_init()
Igor Sysoev <igor@sysoev.ru>
parents: 1683
diff changeset
178 ngx_queue_init(&r->addr_expire_queue);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
179
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
180 #if (NGX_HAVE_INET6)
5478
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
181 r->ipv6 = 1;
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
182
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
183 ngx_rbtree_init(&r->addr6_rbtree, &r->addr6_sentinel,
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
184 ngx_resolver_rbtree_insert_addr6_value);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
185
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
186 ngx_queue_init(&r->addr6_resend_queue);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
187
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
188 ngx_queue_init(&r->addr6_expire_queue);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
189 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
190
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
191 r->event->handler = ngx_resolver_resend_handler;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
192 r->event->data = r;
2785
d478379e51ac *) refactor error_log processing: listen socket log might inherit built-in
Igor Sysoev <igor@sysoev.ru>
parents: 2490
diff changeset
193 r->event->log = &cf->cycle->new_log;
7052
70e65bf8dfd7 Resolver: cancelable resend timer event.
Ruslan Ermilov <ru@nginx.com>
parents: 7051
diff changeset
194 r->event->cancelable = 1;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
195 r->ident = -1;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
196
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
197 r->resend_timeout = 5;
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
198 r->tcp_timeout = 5;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
199 r->expire = 30;
4295
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
200 r->valid = 0;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
201
2785
d478379e51ac *) refactor error_log processing: listen socket log might inherit built-in
Igor Sysoev <igor@sysoev.ru>
parents: 2490
diff changeset
202 r->log = &cf->cycle->new_log;
3763
beca53d6ab3c decrease resolver errors level to error
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
203 r->log_level = NGX_LOG_ERR;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
204
4784
dd63abf20ba7 Resolver: fixed possible memory leak in ngx_resolver_create().
Maxim Dounin <mdounin@mdounin.ru>
parents: 4684
diff changeset
205 if (n) {
6365
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
206 if (ngx_array_init(&r->connections, cf->pool, n,
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
207 sizeof(ngx_resolver_connection_t))
4784
dd63abf20ba7 Resolver: fixed possible memory leak in ngx_resolver_create().
Maxim Dounin <mdounin@mdounin.ru>
parents: 4684
diff changeset
208 != NGX_OK)
dd63abf20ba7 Resolver: fixed possible memory leak in ngx_resolver_create().
Maxim Dounin <mdounin@mdounin.ru>
parents: 4684
diff changeset
209 {
dd63abf20ba7 Resolver: fixed possible memory leak in ngx_resolver_create().
Maxim Dounin <mdounin@mdounin.ru>
parents: 4684
diff changeset
210 return NULL;
dd63abf20ba7 Resolver: fixed possible memory leak in ngx_resolver_create().
Maxim Dounin <mdounin@mdounin.ru>
parents: 4684
diff changeset
211 }
dd63abf20ba7 Resolver: fixed possible memory leak in ngx_resolver_create().
Maxim Dounin <mdounin@mdounin.ru>
parents: 4684
diff changeset
212 }
dd63abf20ba7 Resolver: fixed possible memory leak in ngx_resolver_create().
Maxim Dounin <mdounin@mdounin.ru>
parents: 4684
diff changeset
213
4225
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
214 for (i = 0; i < n; i++) {
4295
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
215 if (ngx_strncmp(names[i].data, "valid=", 6) == 0) {
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
216 s.len = names[i].len - 6;
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
217 s.data = names[i].data + 6;
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
218
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
219 r->valid = ngx_parse_time(&s, 1);
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
220
4474
41f640a693de Time parsing cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
221 if (r->valid == (time_t) NGX_ERROR) {
4295
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
222 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
223 "invalid parameter: %V", &names[i]);
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
224 return NULL;
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
225 }
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
226
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
227 continue;
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
228 }
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
229
5478
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
230 #if (NGX_HAVE_INET6)
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
231 if (ngx_strncmp(names[i].data, "ipv6=", 5) == 0) {
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
232
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
233 if (ngx_strcmp(&names[i].data[5], "on") == 0) {
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
234 r->ipv6 = 1;
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
235
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
236 } else if (ngx_strcmp(&names[i].data[5], "off") == 0) {
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
237 r->ipv6 = 0;
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
238
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
239 } else {
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
240 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
241 "invalid parameter: %V", &names[i]);
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
242 return NULL;
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
243 }
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
244
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
245 continue;
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
246 }
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
247 #endif
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
248
4225
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
249 ngx_memzero(&u, sizeof(ngx_url_t));
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
250
4671
af9342747669 Support for IPv6 literals and an optional port in resolver.
Ruslan Ermilov <ru@nginx.com>
parents: 4653
diff changeset
251 u.url = names[i];
af9342747669 Support for IPv6 literals and an optional port in resolver.
Ruslan Ermilov <ru@nginx.com>
parents: 4653
diff changeset
252 u.default_port = 53;
af9342747669 Support for IPv6 literals and an optional port in resolver.
Ruslan Ermilov <ru@nginx.com>
parents: 4653
diff changeset
253
af9342747669 Support for IPv6 literals and an optional port in resolver.
Ruslan Ermilov <ru@nginx.com>
parents: 4653
diff changeset
254 if (ngx_parse_url(cf->pool, &u) != NGX_OK) {
4643
bc5f881323b8 Fixed potential null pointer dereference in ngx_resolver_create().
Ruslan Ermilov <ru@nginx.com>
parents: 4619
diff changeset
255 if (u.err) {
bc5f881323b8 Fixed potential null pointer dereference in ngx_resolver_create().
Ruslan Ermilov <ru@nginx.com>
parents: 4619
diff changeset
256 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
bc5f881323b8 Fixed potential null pointer dereference in ngx_resolver_create().
Ruslan Ermilov <ru@nginx.com>
parents: 4619
diff changeset
257 "%s in resolver \"%V\"",
4671
af9342747669 Support for IPv6 literals and an optional port in resolver.
Ruslan Ermilov <ru@nginx.com>
parents: 4653
diff changeset
258 u.err, &u.url);
4643
bc5f881323b8 Fixed potential null pointer dereference in ngx_resolver_create().
Ruslan Ermilov <ru@nginx.com>
parents: 4619
diff changeset
259 }
bc5f881323b8 Fixed potential null pointer dereference in ngx_resolver_create().
Ruslan Ermilov <ru@nginx.com>
parents: 4619
diff changeset
260
4225
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
261 return NULL;
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
262 }
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
263
6365
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
264 rec = ngx_array_push_n(&r->connections, u.naddrs);
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
265 if (rec == NULL) {
1683
1e0b028055ec allow to use IP addresses without defined resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1679
diff changeset
266 return NULL;
1e0b028055ec allow to use IP addresses without defined resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1679
diff changeset
267 }
1e0b028055ec allow to use IP addresses without defined resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1679
diff changeset
268
6365
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
269 ngx_memzero(rec, u.naddrs * sizeof(ngx_resolver_connection_t));
4684
f5c2c9d656f9 When "resolver" is configured with a domain name, only the first
Ruslan Ermilov <ru@nginx.com>
parents: 4683
diff changeset
270
f5c2c9d656f9 When "resolver" is configured with a domain name, only the first
Ruslan Ermilov <ru@nginx.com>
parents: 4683
diff changeset
271 for (j = 0; j < u.naddrs; j++) {
6365
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
272 rec[j].sockaddr = u.addrs[j].sockaddr;
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
273 rec[j].socklen = u.addrs[j].socklen;
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
274 rec[j].server = u.addrs[j].name;
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
275 rec[j].resolver = r;
4684
f5c2c9d656f9 When "resolver" is configured with a domain name, only the first
Ruslan Ermilov <ru@nginx.com>
parents: 4683
diff changeset
276 }
1683
1e0b028055ec allow to use IP addresses without defined resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1679
diff changeset
277 }
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
278
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
279 return r;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
280 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
281
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
282
1906
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
283 static void
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
284 ngx_resolver_cleanup(void *data)
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
285 {
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
286 ngx_resolver_t *r = data;
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
287
6365
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
288 ngx_uint_t i;
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
289 ngx_resolver_connection_t *rec;
4225
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
290
1906
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
291 if (r) {
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
292 ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
293 "cleanup resolver");
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
294
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
295 ngx_resolver_cleanup_tree(r, &r->name_rbtree);
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
296
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
297 ngx_resolver_cleanup_tree(r, &r->srv_rbtree);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
298
1906
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
299 ngx_resolver_cleanup_tree(r, &r->addr_rbtree);
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
300
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
301 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
302 ngx_resolver_cleanup_tree(r, &r->addr6_rbtree);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
303 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
304
1906
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
305 if (r->event) {
6843
a3dc657f4e95 Resolver: fixed possible use-after-free in worker on fast shutdown.
Ruslan Ermilov <ru@nginx.com>
parents: 6714
diff changeset
306 if (r->event->timer_set) {
a3dc657f4e95 Resolver: fixed possible use-after-free in worker on fast shutdown.
Ruslan Ermilov <ru@nginx.com>
parents: 6714
diff changeset
307 ngx_del_timer(r->event);
a3dc657f4e95 Resolver: fixed possible use-after-free in worker on fast shutdown.
Ruslan Ermilov <ru@nginx.com>
parents: 6714
diff changeset
308 }
a3dc657f4e95 Resolver: fixed possible use-after-free in worker on fast shutdown.
Ruslan Ermilov <ru@nginx.com>
parents: 6714
diff changeset
309
1906
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
310 ngx_free(r->event);
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
311 }
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
312
4225
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
313
6365
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
314 rec = r->connections.elts;
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
315
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
316 for (i = 0; i < r->connections.nelts; i++) {
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
317 if (rec[i].udp) {
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
318 ngx_close_connection(rec[i].udp);
1906
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
319 }
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
320
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
321 if (rec[i].tcp) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
322 ngx_close_connection(rec[i].tcp);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
323 }
6369
06459bc8b92f Resolver: free TCP buffers on resolver cleanup.
Roman Arutyunyan <arut@nginx.com>
parents: 6368
diff changeset
324
06459bc8b92f Resolver: free TCP buffers on resolver cleanup.
Roman Arutyunyan <arut@nginx.com>
parents: 6368
diff changeset
325 if (rec[i].read_buf) {
06459bc8b92f Resolver: free TCP buffers on resolver cleanup.
Roman Arutyunyan <arut@nginx.com>
parents: 6368
diff changeset
326 ngx_resolver_free(r, rec[i].read_buf->start);
06459bc8b92f Resolver: free TCP buffers on resolver cleanup.
Roman Arutyunyan <arut@nginx.com>
parents: 6368
diff changeset
327 ngx_resolver_free(r, rec[i].read_buf);
06459bc8b92f Resolver: free TCP buffers on resolver cleanup.
Roman Arutyunyan <arut@nginx.com>
parents: 6368
diff changeset
328 }
06459bc8b92f Resolver: free TCP buffers on resolver cleanup.
Roman Arutyunyan <arut@nginx.com>
parents: 6368
diff changeset
329
06459bc8b92f Resolver: free TCP buffers on resolver cleanup.
Roman Arutyunyan <arut@nginx.com>
parents: 6368
diff changeset
330 if (rec[i].write_buf) {
06459bc8b92f Resolver: free TCP buffers on resolver cleanup.
Roman Arutyunyan <arut@nginx.com>
parents: 6368
diff changeset
331 ngx_resolver_free(r, rec[i].write_buf->start);
06459bc8b92f Resolver: free TCP buffers on resolver cleanup.
Roman Arutyunyan <arut@nginx.com>
parents: 6368
diff changeset
332 ngx_resolver_free(r, rec[i].write_buf);
06459bc8b92f Resolver: free TCP buffers on resolver cleanup.
Roman Arutyunyan <arut@nginx.com>
parents: 6368
diff changeset
333 }
1906
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
334 }
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
335
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
336 ngx_free(r);
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
337 }
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
338 }
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
339
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
340
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
341 static void
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
342 ngx_resolver_cleanup_tree(ngx_resolver_t *r, ngx_rbtree_t *tree)
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
343 {
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
344 ngx_resolver_ctx_t *ctx, *next;
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
345 ngx_resolver_node_t *rn;
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
346
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
347 while (tree->root != tree->sentinel) {
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
348
5921
5004210e8c78 Resolver: fixed debug event logging.
Ruslan Ermilov <ru@nginx.com>
parents: 5920
diff changeset
349 rn = ngx_resolver_node(ngx_rbtree_min(tree->root, tree->sentinel));
1906
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
350
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
351 ngx_queue_remove(&rn->queue);
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
352
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
353 for (ctx = rn->waiting; ctx; ctx = next) {
2006
b52cb9bf2064 style fix: remove tabs and trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1969
diff changeset
354 next = ctx->next;
1906
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
355
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
356 if (ctx->event) {
6844
259e2a76e8fb Resolver: fixed possible use-after-free in worker on fast shutdown.
Ruslan Ermilov <ru@nginx.com>
parents: 6843
diff changeset
357 if (ctx->event->timer_set) {
259e2a76e8fb Resolver: fixed possible use-after-free in worker on fast shutdown.
Ruslan Ermilov <ru@nginx.com>
parents: 6843
diff changeset
358 ngx_del_timer(ctx->event);
259e2a76e8fb Resolver: fixed possible use-after-free in worker on fast shutdown.
Ruslan Ermilov <ru@nginx.com>
parents: 6843
diff changeset
359 }
259e2a76e8fb Resolver: fixed possible use-after-free in worker on fast shutdown.
Ruslan Ermilov <ru@nginx.com>
parents: 6843
diff changeset
360
1906
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
361 ngx_resolver_free(r, ctx->event);
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
362 }
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
363
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
364 ngx_resolver_free(r, ctx);
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
365 }
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
366
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
367 ngx_rbtree_delete(tree, &rn->node);
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
368
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
369 ngx_resolver_free_node(r, rn);
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
370 }
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
371 }
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
372
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
373
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
374 ngx_resolver_ctx_t *
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
375 ngx_resolve_start(ngx_resolver_t *r, ngx_resolver_ctx_t *temp)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
376 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
377 in_addr_t addr;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
378 ngx_resolver_ctx_t *ctx;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
379
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
380 if (temp) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
381 addr = ngx_inet_addr(temp->name.data, temp->name.len);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
382
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
383 if (addr != INADDR_NONE) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
384 temp->resolver = r;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
385 temp->state = NGX_OK;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
386 temp->naddrs = 1;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
387 temp->addrs = &temp->addr;
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
388 temp->addr.sockaddr = (struct sockaddr *) &temp->sin;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
389 temp->addr.socklen = sizeof(struct sockaddr_in);
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
390 ngx_memzero(&temp->sin, sizeof(struct sockaddr_in));
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
391 temp->sin.sin_family = AF_INET;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
392 temp->sin.sin_addr.s_addr = addr;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
393 temp->quick = 1;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
394
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
395 return temp;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
396 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
397 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
398
6365
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
399 if (r->connections.nelts == 0) {
1683
1e0b028055ec allow to use IP addresses without defined resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1679
diff changeset
400 return NGX_NO_RESOLVER;
1e0b028055ec allow to use IP addresses without defined resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1679
diff changeset
401 }
1e0b028055ec allow to use IP addresses without defined resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1679
diff changeset
402
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
403 ctx = ngx_resolver_calloc(r, sizeof(ngx_resolver_ctx_t));
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
404
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
405 if (ctx) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
406 ctx->resolver = r;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
407 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
408
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
409 return ctx;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
410 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
411
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
412
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
413 ngx_int_t
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
414 ngx_resolve_name(ngx_resolver_ctx_t *ctx)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
415 {
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
416 size_t slen;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
417 ngx_int_t rc;
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
418 ngx_str_t name;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
419 ngx_resolver_t *r;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
420
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
421 r = ctx->resolver;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
422
5505
d091d16ed398 Resolver: added support for domain names with a trailing dot.
Yichun Zhang <agentzh@gmail.com>
parents: 5485
diff changeset
423 if (ctx->name.len > 0 && ctx->name.data[ctx->name.len - 1] == '.') {
d091d16ed398 Resolver: added support for domain names with a trailing dot.
Yichun Zhang <agentzh@gmail.com>
parents: 5485
diff changeset
424 ctx->name.len--;
d091d16ed398 Resolver: added support for domain names with a trailing dot.
Yichun Zhang <agentzh@gmail.com>
parents: 5485
diff changeset
425 }
d091d16ed398 Resolver: added support for domain names with a trailing dot.
Yichun Zhang <agentzh@gmail.com>
parents: 5485
diff changeset
426
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
427 ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0,
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
428 "resolve: \"%V\"", &ctx->name);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
429
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
430 if (ctx->quick) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
431 ctx->handler(ctx);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
432 return NGX_OK;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
433 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
434
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
435 if (ctx->service.len) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
436 slen = ctx->service.len;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
437
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
438 if (ngx_strlchr(ctx->service.data,
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
439 ctx->service.data + ctx->service.len, '.')
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
440 == NULL)
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
441 {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
442 slen += sizeof("_._tcp") - 1;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
443 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
444
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
445 name.len = slen + 1 + ctx->name.len;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
446
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
447 name.data = ngx_resolver_alloc(r, name.len);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
448 if (name.data == NULL) {
7039
a39bc74873fa Resolver: fixed allocation error handling while resolving SRV.
Bart Warmerdam <bartw@xs4all.nl>
parents: 6922
diff changeset
449 goto failed;
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
450 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
451
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
452 if (slen == ctx->service.len) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
453 ngx_sprintf(name.data, "%V.%V", &ctx->service, &ctx->name);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
454
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
455 } else {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
456 ngx_sprintf(name.data, "_%V._tcp.%V", &ctx->service, &ctx->name);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
457 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
459 /* lock name mutex */
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
460
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
461 rc = ngx_resolve_name_locked(r, ctx, &name);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
462
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
463 ngx_resolver_free(r, name.data);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
464
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
465 } else {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
466 /* lock name mutex */
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
467
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
468 rc = ngx_resolve_name_locked(r, ctx, &ctx->name);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
469 }
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
470
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
471 if (rc == NGX_OK) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
472 return NGX_OK;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
473 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
474
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
475 /* unlock name mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
476
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
477 if (rc == NGX_AGAIN) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
478 return NGX_OK;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
479 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
480
1904
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
481 /* NGX_ERROR */
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
482
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
483 if (ctx->event) {
1904
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
484 ngx_resolver_free(r, ctx->event);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
485 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
486
7039
a39bc74873fa Resolver: fixed allocation error handling while resolving SRV.
Bart Warmerdam <bartw@xs4all.nl>
parents: 6922
diff changeset
487 failed:
a39bc74873fa Resolver: fixed allocation error handling while resolving SRV.
Bart Warmerdam <bartw@xs4all.nl>
parents: 6922
diff changeset
488
1904
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
489 ngx_resolver_free(r, ctx);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
490
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
491 return NGX_ERROR;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
492 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
493
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
494
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
495 void
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
496 ngx_resolve_name_done(ngx_resolver_ctx_t *ctx)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
497 {
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
498 ngx_uint_t i;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
499 ngx_resolver_t *r;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
500 ngx_resolver_ctx_t *w, **p;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
501 ngx_resolver_node_t *rn;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
502
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
503 r = ctx->resolver;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
504
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
505 ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0,
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
506 "resolve name done: %i", ctx->state);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
507
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
508 if (ctx->quick) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
509 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
510 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
511
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
512 if (ctx->event && ctx->event->timer_set) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
513 ngx_del_timer(ctx->event);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
514 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
515
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
516 /* lock name mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
517
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
518 if (ctx->nsrvs) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
519 for (i = 0; i < ctx->nsrvs; i++) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
520 if (ctx->srvs[i].ctx) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
521 ngx_resolve_name_done(ctx->srvs[i].ctx);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
522 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
523
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
524 if (ctx->srvs[i].addrs) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
525 ngx_resolver_free(r, ctx->srvs[i].addrs->sockaddr);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
526 ngx_resolver_free(r, ctx->srvs[i].addrs);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
527 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
528
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
529 ngx_resolver_free(r, ctx->srvs[i].name.data);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
530 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
531
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
532 ngx_resolver_free(r, ctx->srvs);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
533 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
534
6348
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
535 if (ctx->state == NGX_AGAIN || ctx->state == NGX_RESOLVE_TIMEDOUT) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
536
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
537 rn = ctx->node;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
538
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
539 if (rn) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
540 p = &rn->waiting;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
541 w = rn->waiting;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
542
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
543 while (w) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
544 if (w == ctx) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
545 *p = w->next;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
546
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
547 goto done;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
548 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
549
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
550 p = &w->next;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
551 w = w->next;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
552 }
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
553
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
554 ngx_log_error(NGX_LOG_ALERT, r->log, 0,
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
555 "could not cancel %V resolving", &ctx->name);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
556 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
557 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
558
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
559 done:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
560
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
561 if (ctx->service.len) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
562 ngx_resolver_expire(r, &r->srv_rbtree, &r->srv_expire_queue);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
563
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
564 } else {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
565 ngx_resolver_expire(r, &r->name_rbtree, &r->name_expire_queue);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
566 }
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
567
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
568 /* unlock name mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
569
1904
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
570 /* lock alloc mutex */
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
571
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
572 if (ctx->event) {
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
573 ngx_resolver_free_locked(r, ctx->event);
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
574 }
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
575
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
576 ngx_resolver_free_locked(r, ctx);
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
577
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
578 /* unlock alloc mutex */
6196
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
579
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
580 if (r->event->timer_set && ngx_resolver_resend_empty(r)) {
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
581 ngx_del_timer(r->event);
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
582 }
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
583 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
584
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
585
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
586 static ngx_int_t
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
587 ngx_resolve_name_locked(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx,
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
588 ngx_str_t *name)
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
589 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
590 uint32_t hash;
1961
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
591 ngx_int_t rc;
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
592 ngx_str_t cname;
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
593 ngx_uint_t i, naddrs;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
594 ngx_queue_t *resend_queue, *expire_queue;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
595 ngx_rbtree_t *tree;
6349
978e79b95c9f Resolver: fixed CNAME processing for several requests.
Ruslan Ermilov <ru@nginx.com>
parents: 6348
diff changeset
596 ngx_resolver_ctx_t *next, *last;
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
597 ngx_resolver_addr_t *addrs;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
598 ngx_resolver_node_t *rn;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
599
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
600 ngx_strlow(name->data, name->data, name->len);
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
601
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
602 hash = ngx_crc32_short(name->data, name->len);
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
603
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
604 if (ctx->service.len) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
605 rn = ngx_resolver_lookup_srv(r, name, hash);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
606
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
607 tree = &r->srv_rbtree;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
608 resend_queue = &r->srv_resend_queue;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
609 expire_queue = &r->srv_expire_queue;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
610
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
611 } else {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
612 rn = ngx_resolver_lookup_name(r, name, hash);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
613
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
614 tree = &r->name_rbtree;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
615 resend_queue = &r->name_resend_queue;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
616 expire_queue = &r->name_expire_queue;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
617 }
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
618
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
619 if (rn) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
620
6349
978e79b95c9f Resolver: fixed CNAME processing for several requests.
Ruslan Ermilov <ru@nginx.com>
parents: 6348
diff changeset
621 /* ctx can be a list after NGX_RESOLVE_CNAME */
978e79b95c9f Resolver: fixed CNAME processing for several requests.
Ruslan Ermilov <ru@nginx.com>
parents: 6348
diff changeset
622 for (last = ctx; last->next; last = last->next);
978e79b95c9f Resolver: fixed CNAME processing for several requests.
Ruslan Ermilov <ru@nginx.com>
parents: 6348
diff changeset
623
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
624 if (rn->valid >= ngx_time()) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
625
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
626 ngx_log_debug0(NGX_LOG_DEBUG_CORE, r->log, 0, "resolve cached");
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
627
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
628 ngx_queue_remove(&rn->queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
629
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
630 rn->expire = ngx_time() + r->expire;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
631
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
632 ngx_queue_insert_head(expire_queue, &rn->queue);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
633
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
634 naddrs = (rn->naddrs == (u_short) -1) ? 0 : rn->naddrs;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
635 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
636 naddrs += (rn->naddrs6 == (u_short) -1) ? 0 : rn->naddrs6;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
637 #endif
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
638
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
639 if (naddrs) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
640
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
641 if (naddrs == 1 && rn->naddrs == 1) {
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
642 addrs = NULL;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
643
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
644 } else {
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
645 addrs = ngx_resolver_export(r, rn, 1);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
646 if (addrs == NULL) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
647 return NGX_ERROR;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
648 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
649 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
650
6349
978e79b95c9f Resolver: fixed CNAME processing for several requests.
Ruslan Ermilov <ru@nginx.com>
parents: 6348
diff changeset
651 last->next = rn->waiting;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
652 rn->waiting = NULL;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
653
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
654 /* unlock name mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
655
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
656 do {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
657 ctx->state = NGX_OK;
6456
c94aba230a5a Resolver: introduced valid field in resolver responses.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6372
diff changeset
658 ctx->valid = rn->valid;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
659 ctx->naddrs = naddrs;
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
660
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
661 if (addrs == NULL) {
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
662 ctx->addrs = &ctx->addr;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
663 ctx->addr.sockaddr = (struct sockaddr *) &ctx->sin;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
664 ctx->addr.socklen = sizeof(struct sockaddr_in);
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
665 ngx_memzero(&ctx->sin, sizeof(struct sockaddr_in));
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
666 ctx->sin.sin_family = AF_INET;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
667 ctx->sin.sin_addr.s_addr = rn->u.addr;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
668
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
669 } else {
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
670 ctx->addrs = addrs;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
671 }
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
672
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
673 next = ctx->next;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
674
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
675 ctx->handler(ctx);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
676
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
677 ctx = next;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
678 } while (ctx);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
679
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
680 if (addrs != NULL) {
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
681 ngx_resolver_free(r, addrs->sockaddr);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
682 ngx_resolver_free(r, addrs);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
683 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
684
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
685 return NGX_OK;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
686 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
687
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
688 if (rn->nsrvs) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
689 last->next = rn->waiting;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
690 rn->waiting = NULL;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
691
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
692 /* unlock name mutex */
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
693
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
694 do {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
695 next = ctx->next;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
696
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
697 ngx_resolver_resolve_srv_names(ctx, rn);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
698
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
699 ctx = next;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
700 } while (ctx);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
701
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
702 return NGX_OK;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
703 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
704
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
705 /* NGX_RESOLVE_CNAME */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
706
1969
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
707 if (ctx->recursion++ < NGX_RESOLVER_MAX_RECURSION) {
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
708
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
709 cname.len = rn->cnlen;
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
710 cname.data = rn->u.cname;
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
711
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
712 return ngx_resolve_name_locked(r, ctx, &cname);
1969
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
713 }
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
714
6349
978e79b95c9f Resolver: fixed CNAME processing for several requests.
Ruslan Ermilov <ru@nginx.com>
parents: 6348
diff changeset
715 last->next = rn->waiting;
1969
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
716 rn->waiting = NULL;
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
717
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
718 /* unlock name mutex */
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
719
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
720 do {
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
721 ctx->state = NGX_RESOLVE_NXDOMAIN;
6456
c94aba230a5a Resolver: introduced valid field in resolver responses.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6372
diff changeset
722 ctx->valid = ngx_time() + (r->valid ? r->valid : 10);
1969
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
723 next = ctx->next;
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
724
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
725 ctx->handler(ctx);
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
726
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
727 ctx = next;
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
728 } while (ctx);
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
729
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
730 return NGX_OK;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
731 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
732
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
733 if (rn->waiting) {
7051
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
734 if (ngx_resolver_set_timeout(r, ctx) != NGX_OK) {
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
735 return NGX_ERROR;
6348
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
736 }
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
737
6349
978e79b95c9f Resolver: fixed CNAME processing for several requests.
Ruslan Ermilov <ru@nginx.com>
parents: 6348
diff changeset
738 last->next = rn->waiting;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
739 rn->waiting = ctx;
3297
ebc5384479b4 fix segfault in resolver:
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
740 ctx->state = NGX_AGAIN;
7040
d49b74a683b1 Resolver: added the "async" flag to resolver context.
Roman Arutyunyan <arut@nginx.com>
parents: 7039
diff changeset
741 ctx->async = 1;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
742
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
743 do {
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
744 ctx->node = rn;
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
745 ctx = ctx->next;
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
746 } while (ctx);
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
747
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
748 return NGX_AGAIN;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
749 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
750
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
751 ngx_queue_remove(&rn->queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
752
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
753 /* lock alloc mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
754
4619
3171ec7d0d05 Resolver: protection from duplicate responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4610
diff changeset
755 if (rn->query) {
3171ec7d0d05 Resolver: protection from duplicate responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4610
diff changeset
756 ngx_resolver_free_locked(r, rn->query);
3171ec7d0d05 Resolver: protection from duplicate responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4610
diff changeset
757 rn->query = NULL;
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
758 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
759 rn->query6 = NULL;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
760 #endif
4619
3171ec7d0d05 Resolver: protection from duplicate responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4610
diff changeset
761 }
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
762
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
763 if (rn->cnlen) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
764 ngx_resolver_free_locked(r, rn->u.cname);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
765 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
766
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
767 if (rn->naddrs > 1 && rn->naddrs != (u_short) -1) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
768 ngx_resolver_free_locked(r, rn->u.addrs);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
769 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
770
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
771 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
772 if (rn->naddrs6 > 1 && rn->naddrs6 != (u_short) -1) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
773 ngx_resolver_free_locked(r, rn->u6.addrs6);
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
774 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
775 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
776
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
777 if (rn->nsrvs) {
6860
f18c285c2e59 Win32: fixed some warnings reported by Borland C.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6847
diff changeset
778 for (i = 0; i < (ngx_uint_t) rn->nsrvs; i++) {
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
779 if (rn->u.srvs[i].name.data) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
780 ngx_resolver_free_locked(r, rn->u.srvs[i].name.data);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
781 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
782 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
783
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
784 ngx_resolver_free_locked(r, rn->u.srvs);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
785 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
786
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
787 /* unlock alloc mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
788
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
789 } else {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
790
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
791 rn = ngx_resolver_alloc(r, sizeof(ngx_resolver_node_t));
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
792 if (rn == NULL) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
793 return NGX_ERROR;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
794 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
795
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
796 rn->name = ngx_resolver_dup(r, name->data, name->len);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
797 if (rn->name == NULL) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
798 ngx_resolver_free(r, rn);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
799 return NGX_ERROR;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
800 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
801
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
802 rn->node.key = hash;
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
803 rn->nlen = (u_short) name->len;
1960
1609b3c3d604 fix memory leak on resolver query send failure
Igor Sysoev <igor@sysoev.ru>
parents: 1914
diff changeset
804 rn->query = NULL;
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
805 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
806 rn->query6 = NULL;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
807 #endif
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
808
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
809 ngx_rbtree_insert(tree, &rn->node);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
810 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
811
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
812 if (ctx->service.len) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
813 rc = ngx_resolver_create_srv_query(r, rn, name);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
814
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
815 } else {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
816 rc = ngx_resolver_create_name_query(r, rn, name);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
817 }
1961
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
818
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
819 if (rc == NGX_ERROR) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
820 goto failed;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
821 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
822
1961
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
823 if (rc == NGX_DECLINED) {
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
824 ngx_rbtree_delete(tree, &rn->node);
1961
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
825
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
826 ngx_resolver_free(r, rn->query);
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
827 ngx_resolver_free(r, rn->name);
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
828 ngx_resolver_free(r, rn);
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
829
6349
978e79b95c9f Resolver: fixed CNAME processing for several requests.
Ruslan Ermilov <ru@nginx.com>
parents: 6348
diff changeset
830 do {
978e79b95c9f Resolver: fixed CNAME processing for several requests.
Ruslan Ermilov <ru@nginx.com>
parents: 6348
diff changeset
831 ctx->state = NGX_RESOLVE_NXDOMAIN;
978e79b95c9f Resolver: fixed CNAME processing for several requests.
Ruslan Ermilov <ru@nginx.com>
parents: 6348
diff changeset
832 next = ctx->next;
978e79b95c9f Resolver: fixed CNAME processing for several requests.
Ruslan Ermilov <ru@nginx.com>
parents: 6348
diff changeset
833
978e79b95c9f Resolver: fixed CNAME processing for several requests.
Ruslan Ermilov <ru@nginx.com>
parents: 6348
diff changeset
834 ctx->handler(ctx);
978e79b95c9f Resolver: fixed CNAME processing for several requests.
Ruslan Ermilov <ru@nginx.com>
parents: 6348
diff changeset
835
978e79b95c9f Resolver: fixed CNAME processing for several requests.
Ruslan Ermilov <ru@nginx.com>
parents: 6348
diff changeset
836 ctx = next;
978e79b95c9f Resolver: fixed CNAME processing for several requests.
Ruslan Ermilov <ru@nginx.com>
parents: 6348
diff changeset
837 } while (ctx);
1961
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
838
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
839 return NGX_OK;
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
840 }
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
841
6366
2e5c027f2a98 Resolver: per-request DNS server balancer.
Roman Arutyunyan <arut@nginx.com>
parents: 6365
diff changeset
842 rn->last_connection = r->last_connection++;
2e5c027f2a98 Resolver: per-request DNS server balancer.
Roman Arutyunyan <arut@nginx.com>
parents: 6365
diff changeset
843 if (r->last_connection == r->connections.nelts) {
2e5c027f2a98 Resolver: per-request DNS server balancer.
Roman Arutyunyan <arut@nginx.com>
parents: 6365
diff changeset
844 r->last_connection = 0;
2e5c027f2a98 Resolver: per-request DNS server balancer.
Roman Arutyunyan <arut@nginx.com>
parents: 6365
diff changeset
845 }
2e5c027f2a98 Resolver: per-request DNS server balancer.
Roman Arutyunyan <arut@nginx.com>
parents: 6365
diff changeset
846
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
847 rn->naddrs = (u_short) -1;
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
848 rn->tcp = 0;
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
849 #if (NGX_HAVE_INET6)
5478
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
850 rn->naddrs6 = r->ipv6 ? (u_short) -1 : 0;
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
851 rn->tcp6 = 0;
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
852 #endif
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
853 rn->nsrvs = 0;
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
854
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
855 if (ngx_resolver_send_query(r, rn) != NGX_OK) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
856 goto failed;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
857 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
858
7051
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
859 if (ngx_resolver_set_timeout(r, ctx) != NGX_OK) {
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
860 goto failed;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
861 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
862
6846
c3a895b94d3f Resolver: fixed a race between parallel name and addr resolves.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6845
diff changeset
863 if (ngx_resolver_resend_empty(r)) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
864 ngx_add_timer(r->event, (ngx_msec_t) (r->resend_timeout * 1000));
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
865 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
866
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
867 rn->expire = ngx_time() + r->resend_timeout;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
868
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
869 ngx_queue_insert_head(resend_queue, &rn->queue);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
870
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
871 rn->code = 0;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
872 rn->cnlen = 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
873 rn->valid = 0;
5485
8958656a8060 Resolver: use minimum TTL for caching (ticket #329).
Ruslan Ermilov <ru@nginx.com>
parents: 5479
diff changeset
874 rn->ttl = NGX_MAX_UINT32_VALUE;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
875 rn->waiting = ctx;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
876
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
877 ctx->state = NGX_AGAIN;
7040
d49b74a683b1 Resolver: added the "async" flag to resolver context.
Roman Arutyunyan <arut@nginx.com>
parents: 7039
diff changeset
878 ctx->async = 1;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
879
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
880 do {
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
881 ctx->node = rn;
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
882 ctx = ctx->next;
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
883 } while (ctx);
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
884
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
885 return NGX_AGAIN;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
886
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
887 failed:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
888
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
889 ngx_rbtree_delete(tree, &rn->node);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
890
1960
1609b3c3d604 fix memory leak on resolver query send failure
Igor Sysoev <igor@sysoev.ru>
parents: 1914
diff changeset
891 if (rn->query) {
1609b3c3d604 fix memory leak on resolver query send failure
Igor Sysoev <igor@sysoev.ru>
parents: 1914
diff changeset
892 ngx_resolver_free(r, rn->query);
1609b3c3d604 fix memory leak on resolver query send failure
Igor Sysoev <igor@sysoev.ru>
parents: 1914
diff changeset
893 }
1609b3c3d604 fix memory leak on resolver query send failure
Igor Sysoev <igor@sysoev.ru>
parents: 1914
diff changeset
894
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
895 ngx_resolver_free(r, rn->name);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
896
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
897 ngx_resolver_free(r, rn);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
898
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
899 return NGX_ERROR;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
900 }
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
901
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
902
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
903 ngx_int_t
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
904 ngx_resolve_addr(ngx_resolver_ctx_t *ctx)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
905 {
2484
cf3cd450049c store name pointer in variable allocated on stack
Igor Sysoev <igor@sysoev.ru>
parents: 2483
diff changeset
906 u_char *name;
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
907 in_addr_t addr;
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
908 ngx_queue_t *resend_queue, *expire_queue;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
909 ngx_rbtree_t *tree;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
910 ngx_resolver_t *r;
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
911 struct sockaddr_in *sin;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
912 ngx_resolver_node_t *rn;
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
913 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
914 uint32_t hash;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
915 struct sockaddr_in6 *sin6;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
916 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
917
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
918 #if (NGX_SUPPRESS_WARN)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
919 addr = 0;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
920 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
921 hash = 0;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
922 sin6 = NULL;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
923 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
924 #endif
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
925
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
926 r = ctx->resolver;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
927
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
928 switch (ctx->addr.sockaddr->sa_family) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
929
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
930 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
931 case AF_INET6:
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
932 sin6 = (struct sockaddr_in6 *) ctx->addr.sockaddr;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
933 hash = ngx_crc32_short(sin6->sin6_addr.s6_addr, 16);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
934
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
935 /* lock addr mutex */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
936
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
937 rn = ngx_resolver_lookup_addr6(r, &sin6->sin6_addr, hash);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
938
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
939 tree = &r->addr6_rbtree;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
940 resend_queue = &r->addr6_resend_queue;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
941 expire_queue = &r->addr6_expire_queue;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
942
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
943 break;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
944 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
945
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
946 default: /* AF_INET */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
947 sin = (struct sockaddr_in *) ctx->addr.sockaddr;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
948 addr = ntohl(sin->sin_addr.s_addr);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
949
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
950 /* lock addr mutex */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
951
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
952 rn = ngx_resolver_lookup_addr(r, addr);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
953
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
954 tree = &r->addr_rbtree;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
955 resend_queue = &r->addr_resend_queue;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
956 expire_queue = &r->addr_expire_queue;
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
957 }
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
958
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
959 if (rn) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
960
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
961 if (rn->valid >= ngx_time()) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
962
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
963 ngx_log_debug0(NGX_LOG_DEBUG_CORE, r->log, 0, "resolve cached");
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
964
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
965 ngx_queue_remove(&rn->queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
966
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
967 rn->expire = ngx_time() + r->expire;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
968
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
969 ngx_queue_insert_head(expire_queue, &rn->queue);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
970
2484
cf3cd450049c store name pointer in variable allocated on stack
Igor Sysoev <igor@sysoev.ru>
parents: 2483
diff changeset
971 name = ngx_resolver_dup(r, rn->name, rn->nlen);
cf3cd450049c store name pointer in variable allocated on stack
Igor Sysoev <igor@sysoev.ru>
parents: 2483
diff changeset
972 if (name == NULL) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
973 goto failed;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
974 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
975
2484
cf3cd450049c store name pointer in variable allocated on stack
Igor Sysoev <igor@sysoev.ru>
parents: 2483
diff changeset
976 ctx->name.len = rn->nlen;
cf3cd450049c store name pointer in variable allocated on stack
Igor Sysoev <igor@sysoev.ru>
parents: 2483
diff changeset
977 ctx->name.data = name;
cf3cd450049c store name pointer in variable allocated on stack
Igor Sysoev <igor@sysoev.ru>
parents: 2483
diff changeset
978
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
979 /* unlock addr mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
980
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
981 ctx->state = NGX_OK;
6456
c94aba230a5a Resolver: introduced valid field in resolver responses.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6372
diff changeset
982 ctx->valid = rn->valid;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
983
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
984 ctx->handler(ctx);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
985
2484
cf3cd450049c store name pointer in variable allocated on stack
Igor Sysoev <igor@sysoev.ru>
parents: 2483
diff changeset
986 ngx_resolver_free(r, name);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
987
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
988 return NGX_OK;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
989 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
990
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
991 if (rn->waiting) {
7051
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
992 if (ngx_resolver_set_timeout(r, ctx) != NGX_OK) {
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
993 return NGX_ERROR;
6348
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
994 }
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
995
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
996 ctx->next = rn->waiting;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
997 rn->waiting = ctx;
3297
ebc5384479b4 fix segfault in resolver:
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
998 ctx->state = NGX_AGAIN;
7040
d49b74a683b1 Resolver: added the "async" flag to resolver context.
Roman Arutyunyan <arut@nginx.com>
parents: 7039
diff changeset
999 ctx->async = 1;
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
1000 ctx->node = rn;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1001
2487
9b4dce95c744 fix return code, this fixes segfault when two or more
Igor Sysoev <igor@sysoev.ru>
parents: 2486
diff changeset
1002 /* unlock addr mutex */
9b4dce95c744 fix return code, this fixes segfault when two or more
Igor Sysoev <igor@sysoev.ru>
parents: 2486
diff changeset
1003
9b4dce95c744 fix return code, this fixes segfault when two or more
Igor Sysoev <igor@sysoev.ru>
parents: 2486
diff changeset
1004 return NGX_OK;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1005 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1006
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1007 ngx_queue_remove(&rn->queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1008
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1009 ngx_resolver_free(r, rn->query);
1960
1609b3c3d604 fix memory leak on resolver query send failure
Igor Sysoev <igor@sysoev.ru>
parents: 1914
diff changeset
1010 rn->query = NULL;
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1011 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1012 rn->query6 = NULL;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1013 #endif
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1014
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1015 } else {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1016 rn = ngx_resolver_alloc(r, sizeof(ngx_resolver_node_t));
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1017 if (rn == NULL) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1018 goto failed;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1019 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1020
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1021 switch (ctx->addr.sockaddr->sa_family) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1022
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1023 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1024 case AF_INET6:
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1025 rn->addr6 = sin6->sin6_addr;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1026 rn->node.key = hash;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1027 break;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1028 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1029
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1030 default: /* AF_INET */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1031 rn->node.key = addr;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1032 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1033
1960
1609b3c3d604 fix memory leak on resolver query send failure
Igor Sysoev <igor@sysoev.ru>
parents: 1914
diff changeset
1034 rn->query = NULL;
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1035 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1036 rn->query6 = NULL;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1037 #endif
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1038
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1039 ngx_rbtree_insert(tree, &rn->node);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1040 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1041
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
1042 if (ngx_resolver_create_addr_query(r, rn, &ctx->addr) != NGX_OK) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1043 goto failed;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1044 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1045
6366
2e5c027f2a98 Resolver: per-request DNS server balancer.
Roman Arutyunyan <arut@nginx.com>
parents: 6365
diff changeset
1046 rn->last_connection = r->last_connection++;
2e5c027f2a98 Resolver: per-request DNS server balancer.
Roman Arutyunyan <arut@nginx.com>
parents: 6365
diff changeset
1047 if (r->last_connection == r->connections.nelts) {
2e5c027f2a98 Resolver: per-request DNS server balancer.
Roman Arutyunyan <arut@nginx.com>
parents: 6365
diff changeset
1048 r->last_connection = 0;
2e5c027f2a98 Resolver: per-request DNS server balancer.
Roman Arutyunyan <arut@nginx.com>
parents: 6365
diff changeset
1049 }
2e5c027f2a98 Resolver: per-request DNS server balancer.
Roman Arutyunyan <arut@nginx.com>
parents: 6365
diff changeset
1050
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1051 rn->naddrs = (u_short) -1;
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1052 rn->tcp = 0;
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1053 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1054 rn->naddrs6 = (u_short) -1;
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1055 rn->tcp6 = 0;
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1056 #endif
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
1057 rn->nsrvs = 0;
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1058
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1059 if (ngx_resolver_send_query(r, rn) != NGX_OK) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1060 goto failed;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1061 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1062
7051
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
1063 if (ngx_resolver_set_timeout(r, ctx) != NGX_OK) {
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
1064 goto failed;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1065 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1066
6846
c3a895b94d3f Resolver: fixed a race between parallel name and addr resolves.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6845
diff changeset
1067 if (ngx_resolver_resend_empty(r)) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1068 ngx_add_timer(r->event, (ngx_msec_t) (r->resend_timeout * 1000));
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1069 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1070
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1071 rn->expire = ngx_time() + r->resend_timeout;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1072
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1073 ngx_queue_insert_head(resend_queue, &rn->queue);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1074
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1075 rn->code = 0;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1076 rn->cnlen = 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1077 rn->name = NULL;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1078 rn->nlen = 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1079 rn->valid = 0;
5485
8958656a8060 Resolver: use minimum TTL for caching (ticket #329).
Ruslan Ermilov <ru@nginx.com>
parents: 5479
diff changeset
1080 rn->ttl = NGX_MAX_UINT32_VALUE;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1081 rn->waiting = ctx;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1082
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1083 /* unlock addr mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1084
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1085 ctx->state = NGX_AGAIN;
7040
d49b74a683b1 Resolver: added the "async" flag to resolver context.
Roman Arutyunyan <arut@nginx.com>
parents: 7039
diff changeset
1086 ctx->async = 1;
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
1087 ctx->node = rn;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1088
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1089 return NGX_OK;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1090
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1091 failed:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1092
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1093 if (rn) {
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1094 ngx_rbtree_delete(tree, &rn->node);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1095
1960
1609b3c3d604 fix memory leak on resolver query send failure
Igor Sysoev <igor@sysoev.ru>
parents: 1914
diff changeset
1096 if (rn->query) {
1609b3c3d604 fix memory leak on resolver query send failure
Igor Sysoev <igor@sysoev.ru>
parents: 1914
diff changeset
1097 ngx_resolver_free(r, rn->query);
1609b3c3d604 fix memory leak on resolver query send failure
Igor Sysoev <igor@sysoev.ru>
parents: 1914
diff changeset
1098 }
1609b3c3d604 fix memory leak on resolver query send failure
Igor Sysoev <igor@sysoev.ru>
parents: 1914
diff changeset
1099
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1100 ngx_resolver_free(r, rn);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1101 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1102
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1103 /* unlock addr mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1104
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1105 if (ctx->event) {
1904
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
1106 ngx_resolver_free(r, ctx->event);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1107 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1108
1904
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
1109 ngx_resolver_free(r, ctx);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1110
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1111 return NGX_ERROR;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1112 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1113
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1114
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1115 void
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1116 ngx_resolve_addr_done(ngx_resolver_ctx_t *ctx)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1117 {
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1118 ngx_queue_t *expire_queue;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1119 ngx_rbtree_t *tree;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1120 ngx_resolver_t *r;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1121 ngx_resolver_ctx_t *w, **p;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1122 ngx_resolver_node_t *rn;
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1123
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1124 r = ctx->resolver;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1125
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1126 switch (ctx->addr.sockaddr->sa_family) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1127
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1128 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1129 case AF_INET6:
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1130 tree = &r->addr6_rbtree;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1131 expire_queue = &r->addr6_expire_queue;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1132 break;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1133 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1134
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1135 default: /* AF_INET */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1136 tree = &r->addr_rbtree;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1137 expire_queue = &r->addr_expire_queue;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1138 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1139
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1140 ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0,
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1141 "resolve addr done: %i", ctx->state);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1142
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1143 if (ctx->event && ctx->event->timer_set) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1144 ngx_del_timer(ctx->event);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1145 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1146
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1147 /* lock addr mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1148
6348
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
1149 if (ctx->state == NGX_AGAIN || ctx->state == NGX_RESOLVE_TIMEDOUT) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1150
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
1151 rn = ctx->node;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1152
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1153 if (rn) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1154 p = &rn->waiting;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1155 w = rn->waiting;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1156
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1157 while (w) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1158 if (w == ctx) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1159 *p = w->next;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1160
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1161 goto done;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1162 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1163
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1164 p = &w->next;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1165 w = w->next;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1166 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1167 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1168
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1169 {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1170 u_char text[NGX_SOCKADDR_STRLEN];
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1171 ngx_str_t addrtext;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1172
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1173 addrtext.data = text;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1174 addrtext.len = ngx_sock_ntop(ctx->addr.sockaddr, ctx->addr.socklen,
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1175 text, NGX_SOCKADDR_STRLEN, 0);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1176
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1177 ngx_log_error(NGX_LOG_ALERT, r->log, 0,
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1178 "could not cancel %V resolving", &addrtext);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1179 }
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1180 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1181
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1182 done:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1183
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1184 ngx_resolver_expire(r, tree, expire_queue);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1185
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1186 /* unlock addr mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1187
1904
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
1188 /* lock alloc mutex */
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
1189
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
1190 if (ctx->event) {
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
1191 ngx_resolver_free_locked(r, ctx->event);
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
1192 }
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
1193
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
1194 ngx_resolver_free_locked(r, ctx);
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
1195
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
1196 /* unlock alloc mutex */
6196
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
1197
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
1198 if (r->event->timer_set && ngx_resolver_resend_empty(r)) {
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
1199 ngx_del_timer(r->event);
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
1200 }
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1201 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1202
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1203
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1204 static void
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1205 ngx_resolver_expire(ngx_resolver_t *r, ngx_rbtree_t *tree, ngx_queue_t *queue)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1206 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1207 time_t now;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1208 ngx_uint_t i;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1209 ngx_queue_t *q;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1210 ngx_resolver_node_t *rn;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1211
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1212 ngx_log_debug0(NGX_LOG_DEBUG_CORE, r->log, 0, "resolver expire");
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1213
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1214 now = ngx_time();
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1215
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1216 for (i = 0; i < 2; i++) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1217 if (ngx_queue_empty(queue)) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1218 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1219 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1220
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1221 q = ngx_queue_last(queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1222
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1223 rn = ngx_queue_data(q, ngx_resolver_node_t, queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1224
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1225 if (now <= rn->expire) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1226 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1227 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1228
1774
68d21fd1dc64 use %*s format
Igor Sysoev <igor@sysoev.ru>
parents: 1742
diff changeset
1229 ngx_log_debug2(NGX_LOG_DEBUG_CORE, r->log, 0,
68d21fd1dc64 use %*s format
Igor Sysoev <igor@sysoev.ru>
parents: 1742
diff changeset
1230 "resolver expire \"%*s\"", (size_t) rn->nlen, rn->name);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1231
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1232 ngx_queue_remove(q);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1233
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1234 ngx_rbtree_delete(tree, &rn->node);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1235
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1236 ngx_resolver_free_node(r, rn);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1237 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1238 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1239
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1240
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1241 static ngx_int_t
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1242 ngx_resolver_send_query(ngx_resolver_t *r, ngx_resolver_node_t *rn)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1243 {
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1244 ngx_int_t rc;
6365
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
1245 ngx_resolver_connection_t *rec;
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
1246
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
1247 rec = r->connections.elts;
6366
2e5c027f2a98 Resolver: per-request DNS server balancer.
Roman Arutyunyan <arut@nginx.com>
parents: 6365
diff changeset
1248 rec = &rec[rn->last_connection];
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1249
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1250 if (rec->log.handler == NULL) {
6365
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
1251 rec->log = *r->log;
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
1252 rec->log.handler = ngx_resolver_log_error;
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
1253 rec->log.data = rec;
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
1254 rec->log.action = "resolving";
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1255 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1256
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1257 if (rn->naddrs == (u_short) -1) {
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1258 rc = rn->tcp ? ngx_resolver_send_tcp_query(r, rec, rn->query, rn->qlen)
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1259 : ngx_resolver_send_udp_query(r, rec, rn->query, rn->qlen);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1260
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1261 if (rc != NGX_OK) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1262 return rc;
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1263 }
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1264 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1265
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1266 #if (NGX_HAVE_INET6)
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1267
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1268 if (rn->query6 && rn->naddrs6 == (u_short) -1) {
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1269 rc = rn->tcp6
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1270 ? ngx_resolver_send_tcp_query(r, rec, rn->query6, rn->qlen)
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1271 : ngx_resolver_send_udp_query(r, rec, rn->query6, rn->qlen);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1272
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1273 if (rc != NGX_OK) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1274 return rc;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1275 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1276 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1277
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1278 #endif
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1279
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1280 return NGX_OK;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1281 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1282
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1283
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1284 static ngx_int_t
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1285 ngx_resolver_send_udp_query(ngx_resolver_t *r, ngx_resolver_connection_t *rec,
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1286 u_char *query, u_short qlen)
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1287 {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1288 ssize_t n;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1289
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1290 if (rec->udp == NULL) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1291 if (ngx_udp_connect(rec) != NGX_OK) {
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1292 return NGX_ERROR;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1293 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1294
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1295 rec->udp->data = rec;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1296 rec->udp->read->handler = ngx_resolver_udp_read;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1297 rec->udp->read->resolver = 1;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1298 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1299
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1300 n = ngx_send(rec->udp, query, qlen);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1301
7275
e15bf978447e Resolver: style.
Ruslan Ermilov <ru@nginx.com>
parents: 7052
diff changeset
1302 if (n == NGX_ERROR) {
7276
a90f7812de35 Resolver: close UDP socket on error or incomplete send.
Ruslan Ermilov <ru@nginx.com>
parents: 7275
diff changeset
1303 goto failed;
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1304 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1305
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1306 if ((size_t) n != (size_t) qlen) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1307 ngx_log_error(NGX_LOG_CRIT, &rec->log, 0, "send() incomplete");
7276
a90f7812de35 Resolver: close UDP socket on error or incomplete send.
Ruslan Ermilov <ru@nginx.com>
parents: 7275
diff changeset
1308 goto failed;
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1309 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1310
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1311 return NGX_OK;
7276
a90f7812de35 Resolver: close UDP socket on error or incomplete send.
Ruslan Ermilov <ru@nginx.com>
parents: 7275
diff changeset
1312
a90f7812de35 Resolver: close UDP socket on error or incomplete send.
Ruslan Ermilov <ru@nginx.com>
parents: 7275
diff changeset
1313 failed:
a90f7812de35 Resolver: close UDP socket on error or incomplete send.
Ruslan Ermilov <ru@nginx.com>
parents: 7275
diff changeset
1314
a90f7812de35 Resolver: close UDP socket on error or incomplete send.
Ruslan Ermilov <ru@nginx.com>
parents: 7275
diff changeset
1315 ngx_close_connection(rec->udp);
a90f7812de35 Resolver: close UDP socket on error or incomplete send.
Ruslan Ermilov <ru@nginx.com>
parents: 7275
diff changeset
1316 rec->udp = NULL;
a90f7812de35 Resolver: close UDP socket on error or incomplete send.
Ruslan Ermilov <ru@nginx.com>
parents: 7275
diff changeset
1317
a90f7812de35 Resolver: close UDP socket on error or incomplete send.
Ruslan Ermilov <ru@nginx.com>
parents: 7275
diff changeset
1318 return NGX_ERROR;
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1319 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1320
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1321
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1322 static ngx_int_t
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1323 ngx_resolver_send_tcp_query(ngx_resolver_t *r, ngx_resolver_connection_t *rec,
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1324 u_char *query, u_short qlen)
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1325 {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1326 ngx_buf_t *b;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1327 ngx_int_t rc;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1328
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1329 rc = NGX_OK;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1330
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1331 if (rec->tcp == NULL) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1332 b = rec->read_buf;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1333
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1334 if (b == NULL) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1335 b = ngx_resolver_calloc(r, sizeof(ngx_buf_t));
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1336 if (b == NULL) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1337 return NGX_ERROR;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1338 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1339
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1340 b->start = ngx_resolver_alloc(r, NGX_RESOLVER_TCP_RSIZE);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1341 if (b->start == NULL) {
6368
d73f77bb5caf Resolver: fixed possible resource leak introduced in 5a16d40c63de.
Ruslan Ermilov <ru@nginx.com>
parents: 6367
diff changeset
1342 ngx_resolver_free(r, b);
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1343 return NGX_ERROR;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1344 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1345
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1346 b->end = b->start + NGX_RESOLVER_TCP_RSIZE;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1347
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1348 rec->read_buf = b;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1349 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1350
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1351 b->pos = b->start;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1352 b->last = b->start;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1353
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1354 b = rec->write_buf;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1355
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1356 if (b == NULL) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1357 b = ngx_resolver_calloc(r, sizeof(ngx_buf_t));
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1358 if (b == NULL) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1359 return NGX_ERROR;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1360 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1361
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1362 b->start = ngx_resolver_alloc(r, NGX_RESOLVER_TCP_WSIZE);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1363 if (b->start == NULL) {
6368
d73f77bb5caf Resolver: fixed possible resource leak introduced in 5a16d40c63de.
Ruslan Ermilov <ru@nginx.com>
parents: 6367
diff changeset
1364 ngx_resolver_free(r, b);
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1365 return NGX_ERROR;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1366 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1368 b->end = b->start + NGX_RESOLVER_TCP_WSIZE;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1369
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1370 rec->write_buf = b;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1371 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1372
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1373 b->pos = b->start;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1374 b->last = b->start;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1375
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1376 rc = ngx_tcp_connect(rec);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1377 if (rc == NGX_ERROR) {
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1378 return NGX_ERROR;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1379 }
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1380
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1381 rec->tcp->data = rec;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1382 rec->tcp->write->handler = ngx_resolver_tcp_write;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1383 rec->tcp->read->handler = ngx_resolver_tcp_read;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1384 rec->tcp->read->resolver = 1;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1385
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1386 ngx_add_timer(rec->tcp->write, (ngx_msec_t) (r->tcp_timeout * 1000));
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1387 }
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1388
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1389 b = rec->write_buf;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1390
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1391 if (b->end - b->last < 2 + qlen) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1392 ngx_log_error(NGX_LOG_CRIT, &rec->log, 0, "buffer overflow");
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1393 return NGX_ERROR;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1394 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1395
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1396 *b->last++ = (u_char) (qlen >> 8);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1397 *b->last++ = (u_char) qlen;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1398 b->last = ngx_cpymem(b->last, query, qlen);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1399
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1400 if (rc == NGX_OK) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1401 ngx_resolver_tcp_write(rec->tcp->write);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1402 }
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1403
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1404 return NGX_OK;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1405 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1406
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1407
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1408 static void
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1409 ngx_resolver_resend_handler(ngx_event_t *ev)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1410 {
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
1411 time_t timer, atimer, stimer, ntimer;
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1412 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1413 time_t a6timer;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1414 #endif
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1415 ngx_resolver_t *r;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1416
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1417 r = ev->data;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1418
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1419 ngx_log_debug0(NGX_LOG_DEBUG_CORE, r->log, 0,
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1420 "resolver resend handler");
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1421
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1422 /* lock name mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1423
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1424 ntimer = ngx_resolver_resend(r, &r->name_rbtree, &r->name_resend_queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1425
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
1426 stimer = ngx_resolver_resend(r, &r->srv_rbtree, &r->srv_resend_queue);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
1427
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1428 /* unlock name mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1429
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1430 /* lock addr mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1431
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1432 atimer = ngx_resolver_resend(r, &r->addr_rbtree, &r->addr_resend_queue);
1679
ca317d9b5c09 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1649
diff changeset
1433
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1434 /* unlock addr mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1435
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1436 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1437
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1438 /* lock addr6 mutex */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1439
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1440 a6timer = ngx_resolver_resend(r, &r->addr6_rbtree, &r->addr6_resend_queue);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1441
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1442 /* unlock addr6 mutex */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1443
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1444 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1445
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1446 timer = ntimer;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1447
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1448 if (timer == 0) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1449 timer = atimer;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1450
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1451 } else if (atimer) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1452 timer = ngx_min(timer, atimer);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1453 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1454
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
1455 if (timer == 0) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
1456 timer = stimer;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
1457
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
1458 } else if (stimer) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
1459 timer = ngx_min(timer, stimer);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
1460 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
1461
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1462 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1463
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1464 if (timer == 0) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1465 timer = a6timer;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1466
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1467 } else if (a6timer) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1468 timer = ngx_min(timer, a6timer);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1469 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1470
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1471 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1472
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1473 if (timer) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1474 ngx_add_timer(r->event, (ngx_msec_t) (timer * 1000));
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1475 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1476 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1477
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1478
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1479 static time_t
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1480 ngx_resolver_resend(ngx_resolver_t *r, ngx_rbtree_t *tree, ngx_queue_t *queue)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1481 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1482 time_t now;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1483 ngx_queue_t *q;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1484 ngx_resolver_node_t *rn;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1485
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1486 now = ngx_time();
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1487
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1488 for ( ;; ) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1489 if (ngx_queue_empty(queue)) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1490 return 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1491 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1492
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1493 q = ngx_queue_last(queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1494
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1495 rn = ngx_queue_data(q, ngx_resolver_node_t, queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1496
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1497 if (now < rn->expire) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1498 return rn->expire - now;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1499 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1500
1774
68d21fd1dc64 use %*s format
Igor Sysoev <igor@sysoev.ru>
parents: 1742
diff changeset
1501 ngx_log_debug3(NGX_LOG_DEBUG_CORE, r->log, 0,
68d21fd1dc64 use %*s format
Igor Sysoev <igor@sysoev.ru>
parents: 1742
diff changeset
1502 "resolver resend \"%*s\" %p",
68d21fd1dc64 use %*s format
Igor Sysoev <igor@sysoev.ru>
parents: 1742
diff changeset
1503 (size_t) rn->nlen, rn->name, rn->waiting);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1504
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1505 ngx_queue_remove(q);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1506
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1507 if (rn->waiting) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1508
6366
2e5c027f2a98 Resolver: per-request DNS server balancer.
Roman Arutyunyan <arut@nginx.com>
parents: 6365
diff changeset
1509 if (++rn->last_connection == r->connections.nelts) {
2e5c027f2a98 Resolver: per-request DNS server balancer.
Roman Arutyunyan <arut@nginx.com>
parents: 6365
diff changeset
1510 rn->last_connection = 0;
2e5c027f2a98 Resolver: per-request DNS server balancer.
Roman Arutyunyan <arut@nginx.com>
parents: 6365
diff changeset
1511 }
2e5c027f2a98 Resolver: per-request DNS server balancer.
Roman Arutyunyan <arut@nginx.com>
parents: 6365
diff changeset
1512
4683
84d8e60b65f0 Fixed crash in ngx_resolver_cleanup_tree().
Ruslan Ermilov <ru@nginx.com>
parents: 4671
diff changeset
1513 (void) ngx_resolver_send_query(r, rn);
84d8e60b65f0 Fixed crash in ngx_resolver_cleanup_tree().
Ruslan Ermilov <ru@nginx.com>
parents: 4671
diff changeset
1514
84d8e60b65f0 Fixed crash in ngx_resolver_cleanup_tree().
Ruslan Ermilov <ru@nginx.com>
parents: 4671
diff changeset
1515 rn->expire = now + r->resend_timeout;
84d8e60b65f0 Fixed crash in ngx_resolver_cleanup_tree().
Ruslan Ermilov <ru@nginx.com>
parents: 4671
diff changeset
1516
84d8e60b65f0 Fixed crash in ngx_resolver_cleanup_tree().
Ruslan Ermilov <ru@nginx.com>
parents: 4671
diff changeset
1517 ngx_queue_insert_head(queue, q);
1879
cf4ee321d195 do not delete failed DNS request if there are waiting clients
Igor Sysoev <igor@sysoev.ru>
parents: 1878
diff changeset
1518
cf4ee321d195 do not delete failed DNS request if there are waiting clients
Igor Sysoev <igor@sysoev.ru>
parents: 1878
diff changeset
1519 continue;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1520 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1521
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1522 ngx_rbtree_delete(tree, &rn->node);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1523
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1524 ngx_resolver_free_node(r, rn);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1525 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1526 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1527
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1528
6196
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
1529 static ngx_uint_t
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
1530 ngx_resolver_resend_empty(ngx_resolver_t *r)
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
1531 {
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
1532 return ngx_queue_empty(&r->name_resend_queue)
6845
9abba5b70ea0 Resolver: fixed possible premature stop of the resend timer.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6844
diff changeset
1533 && ngx_queue_empty(&r->srv_resend_queue)
6196
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
1534 #if (NGX_HAVE_INET6)
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
1535 && ngx_queue_empty(&r->addr6_resend_queue)
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
1536 #endif
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
1537 && ngx_queue_empty(&r->addr_resend_queue);
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
1538 }
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
1539
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
1540
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1541 static void
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1542 ngx_resolver_udp_read(ngx_event_t *rev)
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1543 {
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1544 ssize_t n;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1545 ngx_connection_t *c;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1546 ngx_resolver_connection_t *rec;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1547 u_char buf[NGX_RESOLVER_UDP_SIZE];
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1548
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1549 c = rev->data;
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1550 rec = c->data;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1551
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1552 do {
1689
0b592a68aade ngx_udp_recv()
Igor Sysoev <igor@sysoev.ru>
parents: 1687
diff changeset
1553 n = ngx_udp_recv(c, buf, NGX_RESOLVER_UDP_SIZE);
0b592a68aade ngx_udp_recv()
Igor Sysoev <igor@sysoev.ru>
parents: 1687
diff changeset
1554
0b592a68aade ngx_udp_recv()
Igor Sysoev <igor@sysoev.ru>
parents: 1687
diff changeset
1555 if (n < 0) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1556 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1557 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1558
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1559 ngx_resolver_process_response(rec->resolver, buf, n, 0);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1560
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1561 } while (rev->ready);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1562 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1563
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1564
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1565 static void
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1566 ngx_resolver_tcp_write(ngx_event_t *wev)
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1567 {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1568 off_t sent;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1569 ssize_t n;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1570 ngx_buf_t *b;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1571 ngx_resolver_t *r;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1572 ngx_connection_t *c;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1573 ngx_resolver_connection_t *rec;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1574
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1575 c = wev->data;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1576 rec = c->data;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1577 b = rec->write_buf;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1578 r = rec->resolver;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1579
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1580 if (wev->timedout) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1581 goto failed;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1582 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1583
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1584 sent = c->sent;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1585
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1586 while (wev->ready && b->pos < b->last) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1587 n = ngx_send(c, b->pos, b->last - b->pos);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1588
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1589 if (n == NGX_AGAIN) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1590 break;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1591 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1592
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1593 if (n == NGX_ERROR) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1594 goto failed;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1595 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1596
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1597 b->pos += n;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1598 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1599
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1600 if (b->pos != b->start) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1601 b->last = ngx_movemem(b->start, b->pos, b->last - b->pos);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1602 b->pos = b->start;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1603 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1604
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1605 if (c->sent != sent) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1606 ngx_add_timer(wev, (ngx_msec_t) (r->tcp_timeout * 1000));
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1607 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1608
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1609 if (ngx_handle_write_event(wev, 0) != NGX_OK) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1610 goto failed;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1611 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1612
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1613 return;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1614
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1615 failed:
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1616
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1617 ngx_close_connection(c);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1618 rec->tcp = NULL;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1619 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1620
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1621
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1622 static void
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1623 ngx_resolver_tcp_read(ngx_event_t *rev)
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1624 {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1625 u_char *p;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1626 size_t size;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1627 ssize_t n;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1628 u_short qlen;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1629 ngx_buf_t *b;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1630 ngx_resolver_t *r;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1631 ngx_connection_t *c;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1632 ngx_resolver_connection_t *rec;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1633
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1634 c = rev->data;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1635 rec = c->data;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1636 b = rec->read_buf;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1637 r = rec->resolver;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1638
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1639 while (rev->ready) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1640 n = ngx_recv(c, b->last, b->end - b->last);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1641
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1642 if (n == NGX_AGAIN) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1643 break;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1644 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1645
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1646 if (n == NGX_ERROR || n == 0) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1647 goto failed;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1648 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1649
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1650 b->last += n;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1651
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1652 for ( ;; ) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1653 p = b->pos;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1654 size = b->last - p;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1655
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1656 if (size < 2) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1657 break;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1658 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1659
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1660 qlen = (u_short) *p++ << 8;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1661 qlen += *p++;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1662
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1663 if (size < (size_t) (2 + qlen)) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1664 break;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1665 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1666
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1667 ngx_resolver_process_response(r, p, qlen, 1);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1668
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1669 b->pos += 2 + qlen;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1670 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1671
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1672 if (b->pos != b->start) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1673 b->last = ngx_movemem(b->start, b->pos, b->last - b->pos);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1674 b->pos = b->start;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1675 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1676 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1677
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1678 if (ngx_handle_read_event(rev, 0) != NGX_OK) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1679 goto failed;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1680 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1681
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1682 return;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1683
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1684 failed:
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1685
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1686 ngx_close_connection(c);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1687 rec->tcp = NULL;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1688 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1689
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1690
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1691 static void
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1692 ngx_resolver_process_response(ngx_resolver_t *r, u_char *buf, size_t n,
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1693 ngx_uint_t tcp)
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1694 {
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1695 char *err;
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1696 ngx_uint_t i, times, ident, qident, flags, code, nqs, nan, trunc,
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1697 qtype, qclass;
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1698 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1699 ngx_uint_t qident6;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1700 #endif
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1701 ngx_queue_t *q;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1702 ngx_resolver_qs_t *qs;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1703 ngx_resolver_hdr_t *response;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1704 ngx_resolver_node_t *rn;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1705
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1706 if (n < sizeof(ngx_resolver_hdr_t)) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1707 goto short_response;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1708 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1709
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1710 response = (ngx_resolver_hdr_t *) buf;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1711
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1712 ident = (response->ident_hi << 8) + response->ident_lo;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1713 flags = (response->flags_hi << 8) + response->flags_lo;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1714 nqs = (response->nqs_hi << 8) + response->nqs_lo;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1715 nan = (response->nan_hi << 8) + response->nan_lo;
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1716 trunc = flags & 0x0200;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1717
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1718 ngx_log_debug6(NGX_LOG_DEBUG_CORE, r->log, 0,
6509
7640d6c213e1 Removed redundant "u" format specifier.
Ruslan Ermilov <ru@nginx.com>
parents: 6478
diff changeset
1719 "resolver DNS response %ui fl:%04Xi %ui/%ui/%ud/%ud",
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1720 ident, flags, nqs, nan,
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1721 (response->nns_hi << 8) + response->nns_lo,
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1722 (response->nar_hi << 8) + response->nar_lo);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1723
5470
aebdca7e8f8f Resolver: fixed response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5469
diff changeset
1724 /* response to a standard query */
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1725 if ((flags & 0xf870) != 0x8000 || (trunc && tcp)) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1726 ngx_log_error(r->log_level, r->log, 0,
6509
7640d6c213e1 Removed redundant "u" format specifier.
Ruslan Ermilov <ru@nginx.com>
parents: 6478
diff changeset
1727 "invalid %s DNS response %ui fl:%04Xi",
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1728 tcp ? "TCP" : "UDP", ident, flags);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1729 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1730 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1731
5470
aebdca7e8f8f Resolver: fixed response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5469
diff changeset
1732 code = flags & 0xf;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1733
2282
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1734 if (code == NGX_RESOLVE_FORMERR) {
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1735
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1736 times = 0;
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1737
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1738 for (q = ngx_queue_head(&r->name_resend_queue);
6347
81d44cd4044e Resolver: fixed possible segmentation fault on DNS format error.
Roman Arutyunyan <arut@nginx.com>
parents: 6196
diff changeset
1739 q != ngx_queue_sentinel(&r->name_resend_queue) && times++ < 100;
2282
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1740 q = ngx_queue_next(q))
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1741 {
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1742 rn = ngx_queue_data(q, ngx_resolver_node_t, queue);
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1743 qident = (rn->query[0] << 8) + rn->query[1];
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1744
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1745 if (qident == ident) {
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1746 goto dns_error_name;
2282
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1747 }
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1748
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1749 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1750 if (rn->query6) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1751 qident6 = (rn->query6[0] << 8) + rn->query6[1];
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1752
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1753 if (qident6 == ident) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1754 goto dns_error_name;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1755 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1756 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1757 #endif
2282
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1758 }
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1759
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1760 goto dns_error;
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1761 }
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1762
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1763 if (code > NGX_RESOLVE_REFUSED) {
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1764 goto dns_error;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1765 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1766
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1767 if (nqs != 1) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1768 err = "invalid number of questions in DNS response";
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1769 goto done;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1770 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1771
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1772 i = sizeof(ngx_resolver_hdr_t);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1773
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1774 while (i < (ngx_uint_t) n) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1775 if (buf[i] == '\0') {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1776 goto found;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1777 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1778
5470
aebdca7e8f8f Resolver: fixed response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5469
diff changeset
1779 i += 1 + buf[i];
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1780 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1781
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1782 goto short_response;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1783
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1784 found:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1785
5470
aebdca7e8f8f Resolver: fixed response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5469
diff changeset
1786 if (i++ == sizeof(ngx_resolver_hdr_t)) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1787 err = "zero-length domain name in DNS response";
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1788 goto done;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1789 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1790
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1791 if (i + sizeof(ngx_resolver_qs_t) + nan * (2 + sizeof(ngx_resolver_an_t))
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1792 > (ngx_uint_t) n)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1793 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1794 goto short_response;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1795 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1796
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1797 qs = (ngx_resolver_qs_t *) &buf[i];
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1798
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1799 qtype = (qs->type_hi << 8) + qs->type_lo;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1800 qclass = (qs->class_hi << 8) + qs->class_lo;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1801
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1802 ngx_log_debug2(NGX_LOG_DEBUG_CORE, r->log, 0,
1967
4a4b15c9c474 use correct ngx_sprintf() formats
Igor Sysoev <igor@sysoev.ru>
parents: 1966
diff changeset
1803 "resolver DNS response qt:%ui cl:%ui", qtype, qclass);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1804
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1805 if (qclass != 1) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1806 ngx_log_error(r->log_level, r->log, 0,
1967
4a4b15c9c474 use correct ngx_sprintf() formats
Igor Sysoev <igor@sysoev.ru>
parents: 1966
diff changeset
1807 "unknown query class %ui in DNS response", qclass);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1808 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1809 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1810
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1811 switch (qtype) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1812
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1813 case NGX_RESOLVE_A:
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1814 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1815 case NGX_RESOLVE_AAAA:
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1816 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1817
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1818 ngx_resolver_process_a(r, buf, n, ident, code, qtype, nan, trunc,
1742
268b81386fe4 no answers in DNS response should be NXDOMAIN
Igor Sysoev <igor@sysoev.ru>
parents: 1741
diff changeset
1819 i + sizeof(ngx_resolver_qs_t));
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1820
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1821 break;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1822
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
1823 case NGX_RESOLVE_SRV:
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
1824
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
1825 ngx_resolver_process_srv(r, buf, n, ident, code, nan, trunc,
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
1826 i + sizeof(ngx_resolver_qs_t));
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
1827
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
1828 break;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
1829
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1830 case NGX_RESOLVE_PTR:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1831
1742
268b81386fe4 no answers in DNS response should be NXDOMAIN
Igor Sysoev <igor@sysoev.ru>
parents: 1741
diff changeset
1832 ngx_resolver_process_ptr(r, buf, n, ident, code, nan);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1833
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1834 break;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1835
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1836 default:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1837 ngx_log_error(r->log_level, r->log, 0,
1967
4a4b15c9c474 use correct ngx_sprintf() formats
Igor Sysoev <igor@sysoev.ru>
parents: 1966
diff changeset
1838 "unknown query type %ui in DNS response", qtype);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1839 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1840 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1841
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1842 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1843
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1844 short_response:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1845
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1846 err = "short DNS response";
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1847
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1848 done:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1849
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1850 ngx_log_error(r->log_level, r->log, 0, err);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1851
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1852 return;
2282
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1853
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1854 dns_error_name:
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1855
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1856 ngx_log_error(r->log_level, r->log, 0,
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1857 "DNS error (%ui: %s), query id:%ui, name:\"%*s\"",
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1858 code, ngx_resolver_strerror(code), ident,
6478
3ef7bb882ad4 Fixed logging with variable field width.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6460
diff changeset
1859 (size_t) rn->nlen, rn->name);
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1860 return;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1861
2282
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1862 dns_error:
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1863
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1864 ngx_log_error(r->log_level, r->log, 0,
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1865 "DNS error (%ui: %s), query id:%ui",
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1866 code, ngx_resolver_strerror(code), ident);
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1867 return;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1868 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1869
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1870
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1871 static void
6370
8c8739bdd3f1 Resolver: style.
Ruslan Ermilov <ru@nginx.com>
parents: 6369
diff changeset
1872 ngx_resolver_process_a(ngx_resolver_t *r, u_char *buf, size_t n,
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1873 ngx_uint_t ident, ngx_uint_t code, ngx_uint_t qtype,
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1874 ngx_uint_t nan, ngx_uint_t trunc, ngx_uint_t ans)
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1875 {
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1876 char *err;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1877 u_char *cname;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1878 size_t len;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1879 int32_t ttl;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1880 uint32_t hash;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1881 in_addr_t *addr;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1882 ngx_str_t name;
6370
8c8739bdd3f1 Resolver: style.
Ruslan Ermilov <ru@nginx.com>
parents: 6369
diff changeset
1883 ngx_uint_t type, class, qident, naddrs, a, i, j, start;
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1884 #if (NGX_HAVE_INET6)
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1885 struct in6_addr *addr6;
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1886 #endif
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1887 ngx_resolver_an_t *an;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1888 ngx_resolver_ctx_t *ctx, *next;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1889 ngx_resolver_node_t *rn;
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
1890 ngx_resolver_addr_t *addrs;
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1891 ngx_resolver_connection_t *rec;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1892
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1893 if (ngx_resolver_copy(r, &name, buf,
6370
8c8739bdd3f1 Resolver: style.
Ruslan Ermilov <ru@nginx.com>
parents: 6369
diff changeset
1894 buf + sizeof(ngx_resolver_hdr_t), buf + n)
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1895 != NGX_OK)
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1896 {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1897 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1898 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1899
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1900 ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0, "resolver qs:%V", &name);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1901
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1902 hash = ngx_crc32_short(name.data, name.len);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1903
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1904 /* lock name mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1905
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1906 rn = ngx_resolver_lookup_name(r, &name, hash);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1907
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1908 if (rn == NULL) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1909 ngx_log_error(r->log_level, r->log, 0,
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1910 "unexpected response for %V", &name);
5471
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
1911 ngx_resolver_free(r, name.data);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1912 goto failed;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1913 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1914
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1915 switch (qtype) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1916
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1917 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1918 case NGX_RESOLVE_AAAA:
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1919
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1920 if (rn->query6 == NULL || rn->naddrs6 != (u_short) -1) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1921 ngx_log_error(r->log_level, r->log, 0,
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1922 "unexpected response for %V", &name);
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1923 ngx_resolver_free(r, name.data);
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1924 goto failed;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1925 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1926
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1927 if (trunc && rn->tcp6) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1928 ngx_resolver_free(r, name.data);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1929 goto failed;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1930 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1931
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1932 qident = (rn->query6[0] << 8) + rn->query6[1];
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1933
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1934 break;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1935 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1936
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1937 default: /* NGX_RESOLVE_A */
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1938
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1939 if (rn->query == NULL || rn->naddrs != (u_short) -1) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1940 ngx_log_error(r->log_level, r->log, 0,
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1941 "unexpected response for %V", &name);
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1942 ngx_resolver_free(r, name.data);
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1943 goto failed;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1944 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1945
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1946 if (trunc && rn->tcp) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1947 ngx_resolver_free(r, name.data);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1948 goto failed;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1949 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1950
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1951 qident = (rn->query[0] << 8) + rn->query[1];
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1952 }
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1953
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1954 if (ident != qident) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1955 ngx_log_error(r->log_level, r->log, 0,
1967
4a4b15c9c474 use correct ngx_sprintf() formats
Igor Sysoev <igor@sysoev.ru>
parents: 1966
diff changeset
1956 "wrong ident %ui response for %V, expect %ui",
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1957 ident, &name, qident);
5471
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
1958 ngx_resolver_free(r, name.data);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1959 goto failed;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1960 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1961
3139
5f6144fc674d fix memory leak in resolver
Igor Sysoev <igor@sysoev.ru>
parents: 2785
diff changeset
1962 ngx_resolver_free(r, name.data);
5f6144fc674d fix memory leak in resolver
Igor Sysoev <igor@sysoev.ru>
parents: 2785
diff changeset
1963
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1964 if (trunc) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1965
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1966 ngx_queue_remove(&rn->queue);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1967
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1968 if (rn->waiting == NULL) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1969 ngx_rbtree_delete(&r->name_rbtree, &rn->node);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1970 ngx_resolver_free_node(r, rn);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1971 goto next;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1972 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1973
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1974 rec = r->connections.elts;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1975 rec = &rec[rn->last_connection];
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1976
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1977 switch (qtype) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1978
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1979 #if (NGX_HAVE_INET6)
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1980 case NGX_RESOLVE_AAAA:
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1981
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1982 rn->tcp6 = 1;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1983
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1984 (void) ngx_resolver_send_tcp_query(r, rec, rn->query6, rn->qlen);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1985
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1986 break;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1987 #endif
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1988
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1989 default: /* NGX_RESOLVE_A */
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1990
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1991 rn->tcp = 1;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1992
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1993 (void) ngx_resolver_send_tcp_query(r, rec, rn->query, rn->qlen);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1994 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1995
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1996 rn->expire = ngx_time() + r->resend_timeout;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1997
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1998 ngx_queue_insert_head(&r->name_resend_queue, &rn->queue);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
1999
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
2000 goto next;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
2001 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
2002
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2003 if (code == 0 && rn->code) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2004 code = rn->code;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2005 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2006
1742
268b81386fe4 no answers in DNS response should be NXDOMAIN
Igor Sysoev <igor@sysoev.ru>
parents: 1741
diff changeset
2007 if (code == 0 && nan == 0) {
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2008
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2009 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2010 switch (qtype) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2011
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2012 case NGX_RESOLVE_AAAA:
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2013
5768
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
2014 rn->naddrs6 = 0;
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
2015
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2016 if (rn->naddrs == (u_short) -1) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2017 goto next;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2018 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2019
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2020 if (rn->naddrs) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2021 goto export;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2022 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2023
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2024 break;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2025
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2026 default: /* NGX_RESOLVE_A */
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2027
5768
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
2028 rn->naddrs = 0;
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
2029
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2030 if (rn->naddrs6 == (u_short) -1) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2031 goto next;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2032 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2033
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2034 if (rn->naddrs6) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2035 goto export;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2036 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2037 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2038 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2039
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2040 code = NGX_RESOLVE_NXDOMAIN;
1742
268b81386fe4 no answers in DNS response should be NXDOMAIN
Igor Sysoev <igor@sysoev.ru>
parents: 1741
diff changeset
2041 }
268b81386fe4 no answers in DNS response should be NXDOMAIN
Igor Sysoev <igor@sysoev.ru>
parents: 1741
diff changeset
2042
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2043 if (code) {
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2044
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2045 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2046 switch (qtype) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2047
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2048 case NGX_RESOLVE_AAAA:
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2049
5768
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
2050 rn->naddrs6 = 0;
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
2051
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2052 if (rn->naddrs == (u_short) -1) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2053 rn->code = (u_char) code;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2054 goto next;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2055 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2056
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2057 break;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2058
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2059 default: /* NGX_RESOLVE_A */
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2060
5768
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
2061 rn->naddrs = 0;
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
2062
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2063 if (rn->naddrs6 == (u_short) -1) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2064 rn->code = (u_char) code;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2065 goto next;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2066 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2067 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2068 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2069
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2070 next = rn->waiting;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2071 rn->waiting = NULL;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2072
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2073 ngx_queue_remove(&rn->queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2074
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2075 ngx_rbtree_delete(&r->name_rbtree, &rn->node);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2076
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2077 /* unlock name mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2078
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2079 while (next) {
5474
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
2080 ctx = next;
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
2081 ctx->state = code;
6456
c94aba230a5a Resolver: introduced valid field in resolver responses.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6372
diff changeset
2082 ctx->valid = ngx_time() + (r->valid ? r->valid : 10);
5474
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
2083 next = ctx->next;
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
2084
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
2085 ctx->handler(ctx);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2086 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2087
5920
7420068c4d4b Resolver: fixed use-after-free memory access.
Ruslan Ermilov <ru@nginx.com>
parents: 5820
diff changeset
2088 ngx_resolver_free_node(r, rn);
7420068c4d4b Resolver: fixed use-after-free memory access.
Ruslan Ermilov <ru@nginx.com>
parents: 5820
diff changeset
2089
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2090 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2091 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2092
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2093 i = ans;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2094 naddrs = 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2095 cname = NULL;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2096
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2097 for (a = 0; a < nan; a++) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2098
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2099 start = i;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2100
6370
8c8739bdd3f1 Resolver: style.
Ruslan Ermilov <ru@nginx.com>
parents: 6369
diff changeset
2101 while (i < n) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2102
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2103 if (buf[i] & 0xc0) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2104 i += 2;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2105 goto found;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2106 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2107
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2108 if (buf[i] == 0) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2109 i++;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2110 goto test_length;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2111 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2112
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2113 i += 1 + buf[i];
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2114 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2115
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2116 goto short_response;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2117
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2118 test_length:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2119
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2120 if (i - start < 2) {
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2121 err = "invalid name in DNS response";
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2122 goto invalid;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2123 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2124
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2125 found:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2126
6370
8c8739bdd3f1 Resolver: style.
Ruslan Ermilov <ru@nginx.com>
parents: 6369
diff changeset
2127 if (i + sizeof(ngx_resolver_an_t) >= n) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2128 goto short_response;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2129 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2130
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2131 an = (ngx_resolver_an_t *) &buf[i];
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2132
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2133 type = (an->type_hi << 8) + an->type_lo;
5471
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
2134 class = (an->class_hi << 8) + an->class_lo;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2135 len = (an->len_hi << 8) + an->len_lo;
4295
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
2136 ttl = (an->ttl[0] << 24) + (an->ttl[1] << 16)
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
2137 + (an->ttl[2] << 8) + (an->ttl[3]);
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
2138
5471
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
2139 if (class != 1) {
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
2140 ngx_log_error(r->log_level, r->log, 0,
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
2141 "unexpected RR class %ui", class);
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
2142 goto failed;
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
2143 }
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
2144
4295
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
2145 if (ttl < 0) {
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
2146 ttl = 0;
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
2147 }
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2148
5485
8958656a8060 Resolver: use minimum TTL for caching (ticket #329).
Ruslan Ermilov <ru@nginx.com>
parents: 5479
diff changeset
2149 rn->ttl = ngx_min(rn->ttl, (uint32_t) ttl);
8958656a8060 Resolver: use minimum TTL for caching (ticket #329).
Ruslan Ermilov <ru@nginx.com>
parents: 5479
diff changeset
2150
5471
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
2151 i += sizeof(ngx_resolver_an_t);
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
2152
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2153 switch (type) {
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2154
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2155 case NGX_RESOLVE_A:
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2156
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2157 if (qtype != NGX_RESOLVE_A) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2158 err = "unexpected A record in DNS response";
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2159 goto invalid;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2160 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2161
5471
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
2162 if (len != 4) {
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
2163 err = "invalid A record in DNS response";
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
2164 goto invalid;
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
2165 }
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
2166
6370
8c8739bdd3f1 Resolver: style.
Ruslan Ermilov <ru@nginx.com>
parents: 6369
diff changeset
2167 if (i + 4 > n) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2168 goto short_response;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2169 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2170
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2171 naddrs++;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2172
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2173 break;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2174
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2175 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2176 case NGX_RESOLVE_AAAA:
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2177
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2178 if (qtype != NGX_RESOLVE_AAAA) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2179 err = "unexpected AAAA record in DNS response";
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2180 goto invalid;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2181 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2182
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2183 if (len != 16) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2184 err = "invalid AAAA record in DNS response";
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2185 goto invalid;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2186 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2187
6370
8c8739bdd3f1 Resolver: style.
Ruslan Ermilov <ru@nginx.com>
parents: 6369
diff changeset
2188 if (i + 16 > n) {
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2189 goto short_response;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2190 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2191
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2192 naddrs++;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2193
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2194 break;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2195 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2196
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2197 case NGX_RESOLVE_CNAME:
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2198
5471
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
2199 cname = &buf[i];
1965
14463ae77723 take into account DNAME
Igor Sysoev <igor@sysoev.ru>
parents: 1961
diff changeset
2200
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2201 break;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2202
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2203 case NGX_RESOLVE_DNAME:
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2204
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2205 break;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2206
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2207 default:
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2208
1966
fb02f63eafd6 log unexpected qtype
Igor Sysoev <igor@sysoev.ru>
parents: 1965
diff changeset
2209 ngx_log_error(r->log_level, r->log, 0,
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2210 "unexpected RR type %ui", type);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2211 }
5471
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
2212
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
2213 i += len;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2214 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2215
4295
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
2216 ngx_log_debug3(NGX_LOG_DEBUG_CORE, r->log, 0,
5485
8958656a8060 Resolver: use minimum TTL for caching (ticket #329).
Ruslan Ermilov <ru@nginx.com>
parents: 5479
diff changeset
2217 "resolver naddrs:%ui cname:%p ttl:%uD",
8958656a8060 Resolver: use minimum TTL for caching (ticket #329).
Ruslan Ermilov <ru@nginx.com>
parents: 5479
diff changeset
2218 naddrs, cname, rn->ttl);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2219
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2220 if (naddrs) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2221
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2222 switch (qtype) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2223
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2224 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2225 case NGX_RESOLVE_AAAA:
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2226
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2227 if (naddrs == 1) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2228 addr6 = &rn->u6.addr6;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2229 rn->naddrs6 = 1;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2230
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2231 } else {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2232 addr6 = ngx_resolver_alloc(r, naddrs * sizeof(struct in6_addr));
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2233 if (addr6 == NULL) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2234 goto failed;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2235 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2236
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2237 rn->u6.addrs6 = addr6;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2238 rn->naddrs6 = (u_short) naddrs;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2239 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2240
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2241 #if (NGX_SUPPRESS_WARN)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2242 addr = NULL;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2243 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2244
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2245 break;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2246 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2247
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2248 default: /* NGX_RESOLVE_A */
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2249
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2250 if (naddrs == 1) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2251 addr = &rn->u.addr;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2252 rn->naddrs = 1;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2253
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2254 } else {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2255 addr = ngx_resolver_alloc(r, naddrs * sizeof(in_addr_t));
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2256 if (addr == NULL) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2257 goto failed;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2258 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2259
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2260 rn->u.addrs = addr;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2261 rn->naddrs = (u_short) naddrs;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2262 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2263
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2264 #if (NGX_HAVE_INET6 && NGX_SUPPRESS_WARN)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2265 addr6 = NULL;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2266 #endif
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2267 }
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2268
6370
8c8739bdd3f1 Resolver: style.
Ruslan Ermilov <ru@nginx.com>
parents: 6369
diff changeset
2269 j = 0;
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2270 i = ans;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2271
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2272 for (a = 0; a < nan; a++) {
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2273
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2274 for ( ;; ) {
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2275
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2276 if (buf[i] & 0xc0) {
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2277 i += 2;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2278 break;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2279 }
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2280
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2281 if (buf[i] == 0) {
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2282 i++;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2283 break;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2284 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2285
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2286 i += 1 + buf[i];
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2287 }
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2288
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2289 an = (ngx_resolver_an_t *) &buf[i];
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2290
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2291 type = (an->type_hi << 8) + an->type_lo;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2292 len = (an->len_hi << 8) + an->len_lo;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2293
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2294 i += sizeof(ngx_resolver_an_t);
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2295
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2296 if (type == NGX_RESOLVE_A) {
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2297
6370
8c8739bdd3f1 Resolver: style.
Ruslan Ermilov <ru@nginx.com>
parents: 6369
diff changeset
2298 addr[j] = htonl((buf[i] << 24) + (buf[i + 1] << 16)
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2299 + (buf[i + 2] << 8) + (buf[i + 3]));
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2300
6370
8c8739bdd3f1 Resolver: style.
Ruslan Ermilov <ru@nginx.com>
parents: 6369
diff changeset
2301 if (++j == naddrs) {
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2302
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2303 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2304 if (rn->naddrs6 == (u_short) -1) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2305 goto next;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2306 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2307 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2308
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2309 break;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2310 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2311 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2312
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2313 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2314 else if (type == NGX_RESOLVE_AAAA) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2315
6370
8c8739bdd3f1 Resolver: style.
Ruslan Ermilov <ru@nginx.com>
parents: 6369
diff changeset
2316 ngx_memcpy(addr6[j].s6_addr, &buf[i], 16);
8c8739bdd3f1 Resolver: style.
Ruslan Ermilov <ru@nginx.com>
parents: 6369
diff changeset
2317
8c8739bdd3f1 Resolver: style.
Ruslan Ermilov <ru@nginx.com>
parents: 6369
diff changeset
2318 if (++j == naddrs) {
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2319
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2320 if (rn->naddrs == (u_short) -1) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2321 goto next;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2322 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2323
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2324 break;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2325 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2326 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2327 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2328
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2329 i += len;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2330 }
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2331 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2332
5768
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
2333 switch (qtype) {
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
2334
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
2335 #if (NGX_HAVE_INET6)
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
2336 case NGX_RESOLVE_AAAA:
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
2337
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
2338 if (rn->naddrs6 == (u_short) -1) {
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
2339 rn->naddrs6 = 0;
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
2340 }
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
2341
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
2342 break;
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
2343 #endif
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
2344
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
2345 default: /* NGX_RESOLVE_A */
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
2346
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
2347 if (rn->naddrs == (u_short) -1) {
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
2348 rn->naddrs = 0;
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
2349 }
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
2350 }
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
2351
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2352 if (rn->naddrs != (u_short) -1
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2353 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2354 && rn->naddrs6 != (u_short) -1
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2355 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2356 && rn->naddrs
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2357 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2358 + rn->naddrs6
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2359 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2360 > 0)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2361 {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2362
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2363 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2364 export:
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2365 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2366
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2367 naddrs = rn->naddrs;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2368 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2369 naddrs += rn->naddrs6;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2370 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2371
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2372 if (naddrs == 1 && rn->naddrs == 1) {
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2373 addrs = NULL;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2374
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2375 } else {
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2376 addrs = ngx_resolver_export(r, rn, 0);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2377 if (addrs == NULL) {
5471
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
2378 goto failed;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2379 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2380 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2381
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2382 ngx_queue_remove(&rn->queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2383
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2384 rn->valid = ngx_time() + (r->valid ? r->valid : (time_t) rn->ttl);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2385 rn->expire = ngx_time() + r->expire;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2386
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2387 ngx_queue_insert_head(&r->name_expire_queue, &rn->queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2388
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2389 next = rn->waiting;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2390 rn->waiting = NULL;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2391
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2392 /* unlock name mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2393
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2394 while (next) {
5474
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
2395 ctx = next;
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
2396 ctx->state = NGX_OK;
6456
c94aba230a5a Resolver: introduced valid field in resolver responses.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6372
diff changeset
2397 ctx->valid = rn->valid;
5474
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
2398 ctx->naddrs = naddrs;
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2399
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2400 if (addrs == NULL) {
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2401 ctx->addrs = &ctx->addr;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2402 ctx->addr.sockaddr = (struct sockaddr *) &ctx->sin;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2403 ctx->addr.socklen = sizeof(struct sockaddr_in);
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2404 ngx_memzero(&ctx->sin, sizeof(struct sockaddr_in));
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2405 ctx->sin.sin_family = AF_INET;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2406 ctx->sin.sin_addr.s_addr = rn->u.addr;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2407
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2408 } else {
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2409 ctx->addrs = addrs;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2410 }
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2411
5474
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
2412 next = ctx->next;
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
2413
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
2414 ctx->handler(ctx);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2415 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2416
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2417 if (addrs != NULL) {
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2418 ngx_resolver_free(r, addrs->sockaddr);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2419 ngx_resolver_free(r, addrs);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2420 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2421
4619
3171ec7d0d05 Resolver: protection from duplicate responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4610
diff changeset
2422 ngx_resolver_free(r, rn->query);
3171ec7d0d05 Resolver: protection from duplicate responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4610
diff changeset
2423 rn->query = NULL;
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2424 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2425 rn->query6 = NULL;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2426 #endif
4619
3171ec7d0d05 Resolver: protection from duplicate responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4610
diff changeset
2427
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2428 return;
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2429 }
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2430
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2431 if (cname) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2432
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2433 /* CNAME only */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2434
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2435 if (rn->naddrs == (u_short) -1
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2436 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2437 || rn->naddrs6 == (u_short) -1
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2438 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2439 )
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2440 {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2441 goto next;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2442 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2443
6370
8c8739bdd3f1 Resolver: style.
Ruslan Ermilov <ru@nginx.com>
parents: 6369
diff changeset
2444 if (ngx_resolver_copy(r, &name, buf, cname, buf + n) != NGX_OK) {
5471
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
2445 goto failed;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2446 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2447
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2448 ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0,
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2449 "resolver cname:\"%V\"", &name);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2450
1741
0829024c924d fix segfault if response will have CNAME only
Igor Sysoev <igor@sysoev.ru>
parents: 1689
diff changeset
2451 ngx_queue_remove(&rn->queue);
0829024c924d fix segfault if response will have CNAME only
Igor Sysoev <igor@sysoev.ru>
parents: 1689
diff changeset
2452
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2453 rn->cnlen = (u_short) name.len;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2454 rn->u.cname = name.data;
4295
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
2455
5485
8958656a8060 Resolver: use minimum TTL for caching (ticket #329).
Ruslan Ermilov <ru@nginx.com>
parents: 5479
diff changeset
2456 rn->valid = ngx_time() + (r->valid ? r->valid : (time_t) rn->ttl);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2457 rn->expire = ngx_time() + r->expire;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2458
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2459 ngx_queue_insert_head(&r->name_expire_queue, &rn->queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2460
6352
ff9b32c0e141 Resolver: limited CNAME recursion.
Ruslan Ermilov <ru@nginx.com>
parents: 6351
diff changeset
2461 ngx_resolver_free(r, rn->query);
ff9b32c0e141 Resolver: limited CNAME recursion.
Ruslan Ermilov <ru@nginx.com>
parents: 6351
diff changeset
2462 rn->query = NULL;
ff9b32c0e141 Resolver: limited CNAME recursion.
Ruslan Ermilov <ru@nginx.com>
parents: 6351
diff changeset
2463 #if (NGX_HAVE_INET6)
ff9b32c0e141 Resolver: limited CNAME recursion.
Ruslan Ermilov <ru@nginx.com>
parents: 6351
diff changeset
2464 rn->query6 = NULL;
ff9b32c0e141 Resolver: limited CNAME recursion.
Ruslan Ermilov <ru@nginx.com>
parents: 6351
diff changeset
2465 #endif
ff9b32c0e141 Resolver: limited CNAME recursion.
Ruslan Ermilov <ru@nginx.com>
parents: 6351
diff changeset
2466
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2467 ctx = rn->waiting;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2468 rn->waiting = NULL;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2469
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2470 if (ctx) {
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
2471
6352
ff9b32c0e141 Resolver: limited CNAME recursion.
Ruslan Ermilov <ru@nginx.com>
parents: 6351
diff changeset
2472 if (ctx->recursion++ >= NGX_RESOLVER_MAX_RECURSION) {
ff9b32c0e141 Resolver: limited CNAME recursion.
Ruslan Ermilov <ru@nginx.com>
parents: 6351
diff changeset
2473
ff9b32c0e141 Resolver: limited CNAME recursion.
Ruslan Ermilov <ru@nginx.com>
parents: 6351
diff changeset
2474 /* unlock name mutex */
ff9b32c0e141 Resolver: limited CNAME recursion.
Ruslan Ermilov <ru@nginx.com>
parents: 6351
diff changeset
2475
ff9b32c0e141 Resolver: limited CNAME recursion.
Ruslan Ermilov <ru@nginx.com>
parents: 6351
diff changeset
2476 do {
ff9b32c0e141 Resolver: limited CNAME recursion.
Ruslan Ermilov <ru@nginx.com>
parents: 6351
diff changeset
2477 ctx->state = NGX_RESOLVE_NXDOMAIN;
ff9b32c0e141 Resolver: limited CNAME recursion.
Ruslan Ermilov <ru@nginx.com>
parents: 6351
diff changeset
2478 next = ctx->next;
ff9b32c0e141 Resolver: limited CNAME recursion.
Ruslan Ermilov <ru@nginx.com>
parents: 6351
diff changeset
2479
ff9b32c0e141 Resolver: limited CNAME recursion.
Ruslan Ermilov <ru@nginx.com>
parents: 6351
diff changeset
2480 ctx->handler(ctx);
ff9b32c0e141 Resolver: limited CNAME recursion.
Ruslan Ermilov <ru@nginx.com>
parents: 6351
diff changeset
2481
ff9b32c0e141 Resolver: limited CNAME recursion.
Ruslan Ermilov <ru@nginx.com>
parents: 6351
diff changeset
2482 ctx = next;
ff9b32c0e141 Resolver: limited CNAME recursion.
Ruslan Ermilov <ru@nginx.com>
parents: 6351
diff changeset
2483 } while (ctx);
ff9b32c0e141 Resolver: limited CNAME recursion.
Ruslan Ermilov <ru@nginx.com>
parents: 6351
diff changeset
2484
ff9b32c0e141 Resolver: limited CNAME recursion.
Ruslan Ermilov <ru@nginx.com>
parents: 6351
diff changeset
2485 return;
ff9b32c0e141 Resolver: limited CNAME recursion.
Ruslan Ermilov <ru@nginx.com>
parents: 6351
diff changeset
2486 }
ff9b32c0e141 Resolver: limited CNAME recursion.
Ruslan Ermilov <ru@nginx.com>
parents: 6351
diff changeset
2487
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
2488 for (next = ctx; next; next = next->next) {
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
2489 next->node = NULL;
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
2490 }
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
2491
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
2492 (void) ngx_resolve_name_locked(r, ctx, &name);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2493 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2494
5471
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
2495 /* unlock name mutex */
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
2496
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2497 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2498 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2499
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2500 ngx_log_error(r->log_level, r->log, 0,
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2501 "no A or CNAME types in DNS response");
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2502 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2503
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2504 short_response:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2505
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2506 err = "short DNS response";
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2507
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2508 invalid:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2509
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2510 /* unlock name mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2511
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2512 ngx_log_error(r->log_level, r->log, 0, err);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2513
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2514 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2515
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2516 failed:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2517
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2518 next:
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2519
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2520 /* unlock name mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2521
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2522 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2523 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2524
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2525
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2526 static void
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2527 ngx_resolver_process_srv(ngx_resolver_t *r, u_char *buf, size_t n,
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2528 ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan,
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2529 ngx_uint_t trunc, ngx_uint_t ans)
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2530 {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2531 char *err;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2532 u_char *cname;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2533 size_t len;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2534 int32_t ttl;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2535 uint32_t hash;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2536 ngx_str_t name;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2537 ngx_uint_t type, qident, class, start, nsrvs, a, i, j;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2538 ngx_resolver_an_t *an;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2539 ngx_resolver_ctx_t *ctx, *next;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2540 ngx_resolver_srv_t *srvs;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2541 ngx_resolver_node_t *rn;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2542 ngx_resolver_connection_t *rec;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2543
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2544 if (ngx_resolver_copy(r, &name, buf,
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2545 buf + sizeof(ngx_resolver_hdr_t), buf + n)
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2546 != NGX_OK)
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2547 {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2548 return;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2549 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2550
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2551 ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0, "resolver qs:%V", &name);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2552
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2553 hash = ngx_crc32_short(name.data, name.len);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2554
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2555 rn = ngx_resolver_lookup_srv(r, &name, hash);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2556
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2557 if (rn == NULL || rn->query == NULL) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2558 ngx_log_error(r->log_level, r->log, 0,
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2559 "unexpected response for %V", &name);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2560 ngx_resolver_free(r, name.data);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2561 goto failed;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2562 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2563
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2564 if (trunc && rn->tcp) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2565 ngx_resolver_free(r, name.data);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2566 goto failed;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2567 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2568
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2569 qident = (rn->query[0] << 8) + rn->query[1];
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2570
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2571 if (ident != qident) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2572 ngx_log_error(r->log_level, r->log, 0,
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2573 "wrong ident %ui response for %V, expect %ui",
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2574 ident, &name, qident);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2575 ngx_resolver_free(r, name.data);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2576 goto failed;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2577 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2578
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2579 ngx_resolver_free(r, name.data);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2580
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2581 if (trunc) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2582
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2583 ngx_queue_remove(&rn->queue);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2584
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2585 if (rn->waiting == NULL) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2586 ngx_rbtree_delete(&r->srv_rbtree, &rn->node);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2587 ngx_resolver_free_node(r, rn);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2588 return;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2589 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2590
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2591 rec = r->connections.elts;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2592 rec = &rec[rn->last_connection];
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2593
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2594 rn->tcp = 1;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2595
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2596 (void) ngx_resolver_send_tcp_query(r, rec, rn->query, rn->qlen);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2597
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2598 rn->expire = ngx_time() + r->resend_timeout;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2599
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2600 ngx_queue_insert_head(&r->srv_resend_queue, &rn->queue);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2601
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2602 return;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2603 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2604
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2605 if (code == 0 && rn->code) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2606 code = rn->code;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2607 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2608
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2609 if (code == 0 && nan == 0) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2610 code = NGX_RESOLVE_NXDOMAIN;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2611 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2612
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2613 if (code) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2614 next = rn->waiting;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2615 rn->waiting = NULL;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2616
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2617 ngx_queue_remove(&rn->queue);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2618
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2619 ngx_rbtree_delete(&r->srv_rbtree, &rn->node);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2620
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2621 while (next) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2622 ctx = next;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2623 ctx->state = code;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2624 ctx->valid = ngx_time() + (r->valid ? r->valid : 10);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2625 next = ctx->next;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2626
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2627 ctx->handler(ctx);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2628 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2629
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2630 ngx_resolver_free_node(r, rn);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2631
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2632 return;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2633 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2634
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2635 i = ans;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2636 nsrvs = 0;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2637 cname = NULL;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2638
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2639 for (a = 0; a < nan; a++) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2640
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2641 start = i;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2642
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2643 while (i < n) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2644
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2645 if (buf[i] & 0xc0) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2646 i += 2;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2647 goto found;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2648 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2649
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2650 if (buf[i] == 0) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2651 i++;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2652 goto test_length;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2653 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2654
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2655 i += 1 + buf[i];
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2656 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2657
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2658 goto short_response;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2659
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2660 test_length:
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2661
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2662 if (i - start < 2) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2663 err = "invalid name DNS response";
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2664 goto invalid;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2665 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2666
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2667 found:
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2668
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2669 if (i + sizeof(ngx_resolver_an_t) >= n) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2670 goto short_response;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2671 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2672
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2673 an = (ngx_resolver_an_t *) &buf[i];
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2674
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2675 type = (an->type_hi << 8) + an->type_lo;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2676 class = (an->class_hi << 8) + an->class_lo;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2677 len = (an->len_hi << 8) + an->len_lo;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2678 ttl = (an->ttl[0] << 24) + (an->ttl[1] << 16)
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2679 + (an->ttl[2] << 8) + (an->ttl[3]);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2680
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2681 if (class != 1) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2682 ngx_log_error(r->log_level, r->log, 0,
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2683 "unexpected RR class %ui", class);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2684 goto failed;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2685 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2686
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2687 if (ttl < 0) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2688 ttl = 0;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2689 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2690
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2691 rn->ttl = ngx_min(rn->ttl, (uint32_t) ttl);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2692
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2693 i += sizeof(ngx_resolver_an_t);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2694
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2695 switch (type) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2696
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2697 case NGX_RESOLVE_SRV:
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2698
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2699 if (i + 6 > n) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2700 goto short_response;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2701 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2702
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2703 if (ngx_resolver_copy(r, NULL, buf, &buf[i + 6], buf + n)
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2704 != NGX_OK)
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2705 {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2706 goto failed;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2707 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2708
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2709 nsrvs++;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2710
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2711 break;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2712
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2713 case NGX_RESOLVE_CNAME:
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2714
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2715 cname = &buf[i];
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2716
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2717 break;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2718
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2719 case NGX_RESOLVE_DNAME:
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2720
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2721 break;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2722
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2723 default:
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2724
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2725 ngx_log_error(r->log_level, r->log, 0,
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2726 "unexpected RR type %ui", type);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2727 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2728
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2729 i += len;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2730 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2731
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2732 ngx_log_debug3(NGX_LOG_DEBUG_CORE, r->log, 0,
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2733 "resolver nsrvs:%ui cname:%p ttl:%uD",
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2734 nsrvs, cname, rn->ttl);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2735
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2736 if (nsrvs) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2737
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2738 srvs = ngx_resolver_calloc(r, nsrvs * sizeof(ngx_resolver_srv_t));
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2739 if (srvs == NULL) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2740 goto failed;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2741 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2742
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2743 rn->u.srvs = srvs;
6460
034329824dd3 Win32: fixed build after 384154fc634f.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6458
diff changeset
2744 rn->nsrvs = (u_short) nsrvs;
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2745
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2746 j = 0;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2747 i = ans;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2748
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2749 for (a = 0; a < nan; a++) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2750
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2751 for ( ;; ) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2752
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2753 if (buf[i] & 0xc0) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2754 i += 2;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2755 break;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2756 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2757
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2758 if (buf[i] == 0) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2759 i++;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2760 break;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2761 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2762
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2763 i += 1 + buf[i];
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2764 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2765
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2766 an = (ngx_resolver_an_t *) &buf[i];
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2767
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2768 type = (an->type_hi << 8) + an->type_lo;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2769 len = (an->len_hi << 8) + an->len_lo;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2770
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2771 i += sizeof(ngx_resolver_an_t);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2772
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2773 if (type == NGX_RESOLVE_SRV) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2774
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2775 srvs[j].priority = (buf[i] << 8) + buf[i + 1];
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2776 srvs[j].weight = (buf[i + 2] << 8) + buf[i + 3];
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2777
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2778 if (srvs[j].weight == 0) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2779 srvs[j].weight = 1;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2780 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2781
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2782 srvs[j].port = (buf[i + 4] << 8) + buf[i + 5];
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2783
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2784 if (ngx_resolver_copy(r, &srvs[j].name, buf, &buf[i + 6],
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2785 buf + n)
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2786 != NGX_OK)
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2787 {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2788 goto failed;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2789 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2790
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2791 j++;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2792 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2793
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2794 i += len;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2795 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2796
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2797 ngx_sort(srvs, nsrvs, sizeof(ngx_resolver_srv_t),
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2798 ngx_resolver_cmp_srvs);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2799
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2800 ngx_resolver_free(r, rn->query);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2801 rn->query = NULL;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2802
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2803 ngx_queue_remove(&rn->queue);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2804
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2805 rn->valid = ngx_time() + (r->valid ? r->valid : (time_t) rn->ttl);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2806 rn->expire = ngx_time() + r->expire;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2807
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2808 ngx_queue_insert_head(&r->srv_expire_queue, &rn->queue);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2809
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2810 next = rn->waiting;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2811 rn->waiting = NULL;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2812
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2813 while (next) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2814 ctx = next;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2815 next = ctx->next;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2816
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2817 ngx_resolver_resolve_srv_names(ctx, rn);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2818 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2819
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2820 return;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2821 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2822
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2823 rn->nsrvs = 0;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2824
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2825 if (cname) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2826
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2827 /* CNAME only */
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2828
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2829 if (ngx_resolver_copy(r, &name, buf, cname, buf + n) != NGX_OK) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2830 goto failed;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2831 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2832
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2833 ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0,
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2834 "resolver cname:\"%V\"", &name);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2835
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2836 ngx_queue_remove(&rn->queue);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2837
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2838 rn->cnlen = (u_short) name.len;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2839 rn->u.cname = name.data;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2840
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2841 rn->valid = ngx_time() + (r->valid ? r->valid : (time_t) rn->ttl);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2842 rn->expire = ngx_time() + r->expire;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2843
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2844 ngx_queue_insert_head(&r->srv_expire_queue, &rn->queue);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2845
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2846 ngx_resolver_free(r, rn->query);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2847 rn->query = NULL;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2848 #if (NGX_HAVE_INET6)
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2849 rn->query6 = NULL;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2850 #endif
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2851
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2852 ctx = rn->waiting;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2853 rn->waiting = NULL;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2854
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2855 if (ctx) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2856
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2857 if (ctx->recursion++ >= NGX_RESOLVER_MAX_RECURSION) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2858
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2859 /* unlock name mutex */
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2860
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2861 do {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2862 ctx->state = NGX_RESOLVE_NXDOMAIN;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2863 next = ctx->next;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2864
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2865 ctx->handler(ctx);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2866
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2867 ctx = next;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2868 } while (ctx);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2869
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2870 return;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2871 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2872
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2873 for (next = ctx; next; next = next->next) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2874 next->node = NULL;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2875 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2876
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2877 (void) ngx_resolve_name_locked(r, ctx, &name);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2878 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2879
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2880 /* unlock name mutex */
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2881
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2882 return;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2883 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2884
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2885 ngx_log_error(r->log_level, r->log, 0, "no SRV type in DNS response");
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2886
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2887 return;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2888
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2889 short_response:
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2890
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2891 err = "short DNS response";
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2892
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2893 invalid:
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2894
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2895 /* unlock name mutex */
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2896
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2897 ngx_log_error(r->log_level, r->log, 0, err);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2898
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2899 return;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2900
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2901 failed:
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2902
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2903 /* unlock name mutex */
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2904
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2905 return;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2906 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2907
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2908
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2909 static void
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2910 ngx_resolver_resolve_srv_names(ngx_resolver_ctx_t *ctx, ngx_resolver_node_t *rn)
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2911 {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2912 ngx_uint_t i;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2913 ngx_resolver_t *r;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2914 ngx_resolver_ctx_t *cctx;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2915 ngx_resolver_srv_name_t *srvs;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2916
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2917 r = ctx->resolver;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2918
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2919 ctx->node = NULL;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2920 ctx->state = NGX_OK;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2921 ctx->valid = rn->valid;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2922 ctx->count = rn->nsrvs;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2923
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2924 srvs = ngx_resolver_calloc(r, rn->nsrvs * sizeof(ngx_resolver_srv_name_t));
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2925 if (srvs == NULL) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2926 goto failed;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2927 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2928
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2929 ctx->srvs = srvs;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2930 ctx->nsrvs = rn->nsrvs;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2931
6847
d72b38376092 Resolver: fixed handling of partially resolved SRV.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6846
diff changeset
2932 if (ctx->event && ctx->event->timer_set) {
d72b38376092 Resolver: fixed handling of partially resolved SRV.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6846
diff changeset
2933 ngx_del_timer(ctx->event);
d72b38376092 Resolver: fixed handling of partially resolved SRV.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6846
diff changeset
2934 }
d72b38376092 Resolver: fixed handling of partially resolved SRV.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6846
diff changeset
2935
6860
f18c285c2e59 Win32: fixed some warnings reported by Borland C.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6847
diff changeset
2936 for (i = 0; i < (ngx_uint_t) rn->nsrvs; i++) {
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2937 srvs[i].name.data = ngx_resolver_alloc(r, rn->u.srvs[i].name.len);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2938 if (srvs[i].name.data == NULL) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2939 goto failed;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2940 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2941
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2942 srvs[i].name.len = rn->u.srvs[i].name.len;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2943 ngx_memcpy(srvs[i].name.data, rn->u.srvs[i].name.data,
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2944 srvs[i].name.len);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2945
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2946 cctx = ngx_resolve_start(r, NULL);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2947 if (cctx == NULL) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2948 goto failed;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2949 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2950
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2951 cctx->name = srvs[i].name;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2952 cctx->handler = ngx_resolver_srv_names_handler;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2953 cctx->data = ctx;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2954 cctx->srvs = &srvs[i];
6847
d72b38376092 Resolver: fixed handling of partially resolved SRV.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6846
diff changeset
2955 cctx->timeout = ctx->timeout;
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2956
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2957 srvs[i].priority = rn->u.srvs[i].priority;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2958 srvs[i].weight = rn->u.srvs[i].weight;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2959 srvs[i].port = rn->u.srvs[i].port;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2960 srvs[i].ctx = cctx;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2961
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2962 if (ngx_resolve_name(cctx) == NGX_ERROR) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2963 srvs[i].ctx = NULL;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2964 goto failed;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2965 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2966 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2967
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2968 return;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2969
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2970 failed:
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2971
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2972 ctx->state = NGX_ERROR;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2973 ctx->valid = ngx_time() + (r->valid ? r->valid : 10);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2974
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2975 ctx->handler(ctx);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2976 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2977
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2978
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2979 static void
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2980 ngx_resolver_srv_names_handler(ngx_resolver_ctx_t *cctx)
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2981 {
6559
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6509
diff changeset
2982 ngx_uint_t i;
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6509
diff changeset
2983 ngx_addr_t *addrs;
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6509
diff changeset
2984 ngx_resolver_t *r;
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6509
diff changeset
2985 ngx_sockaddr_t *sockaddr;
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6509
diff changeset
2986 ngx_resolver_ctx_t *ctx;
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6509
diff changeset
2987 ngx_resolver_srv_name_t *srv;
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2988
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2989 r = cctx->resolver;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2990 ctx = cctx->data;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2991 srv = cctx->srvs;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2992
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2993 ctx->count--;
7040
d49b74a683b1 Resolver: added the "async" flag to resolver context.
Roman Arutyunyan <arut@nginx.com>
parents: 7039
diff changeset
2994 ctx->async |= cctx->async;
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2995
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2996 srv->ctx = NULL;
6714
c3e3de6d2672 Resolver: introduced state field in ngx_resolver_srv_name_t.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6593
diff changeset
2997 srv->state = cctx->state;
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2998
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
2999 if (cctx->naddrs) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3000
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3001 ctx->valid = ngx_min(ctx->valid, cctx->valid);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3002
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3003 addrs = ngx_resolver_calloc(r, cctx->naddrs * sizeof(ngx_addr_t));
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3004 if (addrs == NULL) {
7048
80224192163c Resolver: fixed possible use-after-free while resolving SRV.
Roman Arutyunyan <arut@nginx.com>
parents: 7040
diff changeset
3005 srv->state = NGX_ERROR;
80224192163c Resolver: fixed possible use-after-free while resolving SRV.
Roman Arutyunyan <arut@nginx.com>
parents: 7040
diff changeset
3006 goto done;
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3007 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3008
6559
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6509
diff changeset
3009 sockaddr = ngx_resolver_alloc(r, cctx->naddrs * sizeof(ngx_sockaddr_t));
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3010 if (sockaddr == NULL) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3011 ngx_resolver_free(r, addrs);
7048
80224192163c Resolver: fixed possible use-after-free while resolving SRV.
Roman Arutyunyan <arut@nginx.com>
parents: 7040
diff changeset
3012 srv->state = NGX_ERROR;
80224192163c Resolver: fixed possible use-after-free while resolving SRV.
Roman Arutyunyan <arut@nginx.com>
parents: 7040
diff changeset
3013 goto done;
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3014 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3015
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3016 for (i = 0; i < cctx->naddrs; i++) {
6559
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6509
diff changeset
3017 addrs[i].sockaddr = &sockaddr[i].sockaddr;
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3018 addrs[i].socklen = cctx->addrs[i].socklen;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3019
6559
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6509
diff changeset
3020 ngx_memcpy(&sockaddr[i], cctx->addrs[i].sockaddr,
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3021 addrs[i].socklen);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3022
6593
b3b7e33083ac Introduced ngx_inet_get_port() and ngx_inet_set_port() functions.
Roman Arutyunyan <arut@nginx.com>
parents: 6559
diff changeset
3023 ngx_inet_set_port(addrs[i].sockaddr, srv->port);
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3024 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3025
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3026 srv->addrs = addrs;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3027 srv->naddrs = cctx->naddrs;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3028 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3029
7048
80224192163c Resolver: fixed possible use-after-free while resolving SRV.
Roman Arutyunyan <arut@nginx.com>
parents: 7040
diff changeset
3030 done:
80224192163c Resolver: fixed possible use-after-free while resolving SRV.
Roman Arutyunyan <arut@nginx.com>
parents: 7040
diff changeset
3031
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3032 ngx_resolve_name_done(cctx);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3033
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3034 if (ctx->count == 0) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3035 ngx_resolver_report_srv(r, ctx);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3036 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3037 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3038
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3039
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3040 static void
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3041 ngx_resolver_process_ptr(ngx_resolver_t *r, u_char *buf, size_t n,
1742
268b81386fe4 no answers in DNS response should be NXDOMAIN
Igor Sysoev <igor@sysoev.ru>
parents: 1741
diff changeset
3042 ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan)
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3043 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3044 char *err;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3045 size_t len;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3046 in_addr_t addr;
4295
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
3047 int32_t ttl;
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
3048 ngx_int_t octet;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3049 ngx_str_t name;
6371
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3050 ngx_uint_t mask, type, class, qident, a, i, start;
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3051 ngx_queue_t *expire_queue;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3052 ngx_rbtree_t *tree;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3053 ngx_resolver_an_t *an;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3054 ngx_resolver_ctx_t *ctx, *next;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3055 ngx_resolver_node_t *rn;
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3056 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3057 uint32_t hash;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3058 ngx_int_t digit;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3059 struct in6_addr addr6;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3060 #endif
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3061
6372
a6a5bacf6b74 Resolver: style.
Ruslan Ermilov <ru@nginx.com>
parents: 6371
diff changeset
3062 if (ngx_resolver_copy(r, &name, buf,
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
3063 buf + sizeof(ngx_resolver_hdr_t), buf + n)
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
3064 != NGX_OK)
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
3065 {
5472
ab493c60d9ff Resolver: fixes in PTR processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5471
diff changeset
3066 return;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3067 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3068
6372
a6a5bacf6b74 Resolver: style.
Ruslan Ermilov <ru@nginx.com>
parents: 6371
diff changeset
3069 ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0, "resolver qs:%V", &name);
a6a5bacf6b74 Resolver: style.
Ruslan Ermilov <ru@nginx.com>
parents: 6371
diff changeset
3070
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3071 /* AF_INET */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3072
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3073 addr = 0;
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
3074 i = sizeof(ngx_resolver_hdr_t);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3075
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3076 for (mask = 0; mask < 32; mask += 8) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3077 len = buf[i++];
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3078
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
3079 octet = ngx_atoi(&buf[i], len);
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
3080 if (octet == NGX_ERROR || octet > 255) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3081 goto invalid_in_addr_arpa;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3082 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3083
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
3084 addr += octet << mask;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3085 i += len;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3086 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3087
5479
c0d6eae5a1c5 Resolver: lookups are case-insensitive.
Ruslan Ermilov <ru@nginx.com>
parents: 5478
diff changeset
3088 if (ngx_strcasecmp(&buf[i], (u_char *) "\7in-addr\4arpa") == 0) {
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3089 i += sizeof("\7in-addr\4arpa");
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3090
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3091 /* lock addr mutex */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3092
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3093 rn = ngx_resolver_lookup_addr(r, addr);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3094
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3095 tree = &r->addr_rbtree;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3096 expire_queue = &r->addr_expire_queue;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3097
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3098 goto valid;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3099 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3100
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3101 invalid_in_addr_arpa:
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3102
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3103 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3104
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3105 i = sizeof(ngx_resolver_hdr_t);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3106
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3107 for (octet = 15; octet >= 0; octet--) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3108 if (buf[i++] != '\1') {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3109 goto invalid_ip6_arpa;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3110 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3111
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3112 digit = ngx_hextoi(&buf[i++], 1);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3113 if (digit == NGX_ERROR) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3114 goto invalid_ip6_arpa;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3115 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3116
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3117 addr6.s6_addr[octet] = (u_char) digit;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3118
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3119 if (buf[i++] != '\1') {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3120 goto invalid_ip6_arpa;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3121 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3122
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3123 digit = ngx_hextoi(&buf[i++], 1);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3124 if (digit == NGX_ERROR) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3125 goto invalid_ip6_arpa;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3126 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3127
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3128 addr6.s6_addr[octet] += (u_char) (digit * 16);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3129 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3130
5479
c0d6eae5a1c5 Resolver: lookups are case-insensitive.
Ruslan Ermilov <ru@nginx.com>
parents: 5478
diff changeset
3131 if (ngx_strcasecmp(&buf[i], (u_char *) "\3ip6\4arpa") == 0) {
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3132 i += sizeof("\3ip6\4arpa");
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3133
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3134 /* lock addr mutex */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3135
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3136 hash = ngx_crc32_short(addr6.s6_addr, 16);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3137 rn = ngx_resolver_lookup_addr6(r, &addr6, hash);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3138
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3139 tree = &r->addr6_rbtree;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3140 expire_queue = &r->addr6_expire_queue;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3141
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3142 goto valid;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3143 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3144
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3145 invalid_ip6_arpa:
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3146 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3147
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3148 ngx_log_error(r->log_level, r->log, 0,
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3149 "invalid in-addr.arpa or ip6.arpa name in DNS response");
6372
a6a5bacf6b74 Resolver: style.
Ruslan Ermilov <ru@nginx.com>
parents: 6371
diff changeset
3150 ngx_resolver_free(r, name.data);
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3151 return;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3152
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3153 valid:
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3154
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3155 if (rn == NULL || rn->query == NULL) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3156 ngx_log_error(r->log_level, r->log, 0,
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3157 "unexpected response for %V", &name);
6372
a6a5bacf6b74 Resolver: style.
Ruslan Ermilov <ru@nginx.com>
parents: 6371
diff changeset
3158 ngx_resolver_free(r, name.data);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3159 goto failed;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3160 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3161
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3162 qident = (rn->query[0] << 8) + rn->query[1];
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3163
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3164 if (ident != qident) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3165 ngx_log_error(r->log_level, r->log, 0,
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3166 "wrong ident %ui response for %V, expect %ui",
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3167 ident, &name, qident);
6372
a6a5bacf6b74 Resolver: style.
Ruslan Ermilov <ru@nginx.com>
parents: 6371
diff changeset
3168 ngx_resolver_free(r, name.data);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3169 goto failed;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3170 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3171
6372
a6a5bacf6b74 Resolver: style.
Ruslan Ermilov <ru@nginx.com>
parents: 6371
diff changeset
3172 ngx_resolver_free(r, name.data);
a6a5bacf6b74 Resolver: style.
Ruslan Ermilov <ru@nginx.com>
parents: 6371
diff changeset
3173
1742
268b81386fe4 no answers in DNS response should be NXDOMAIN
Igor Sysoev <igor@sysoev.ru>
parents: 1741
diff changeset
3174 if (code == 0 && nan == 0) {
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
3175 code = NGX_RESOLVE_NXDOMAIN;
1742
268b81386fe4 no answers in DNS response should be NXDOMAIN
Igor Sysoev <igor@sysoev.ru>
parents: 1741
diff changeset
3176 }
268b81386fe4 no answers in DNS response should be NXDOMAIN
Igor Sysoev <igor@sysoev.ru>
parents: 1741
diff changeset
3177
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3178 if (code) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3179 next = rn->waiting;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3180 rn->waiting = NULL;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3181
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3182 ngx_queue_remove(&rn->queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3183
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3184 ngx_rbtree_delete(tree, &rn->node);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3185
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3186 /* unlock addr mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3187
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3188 while (next) {
5474
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
3189 ctx = next;
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
3190 ctx->state = code;
6456
c94aba230a5a Resolver: introduced valid field in resolver responses.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6372
diff changeset
3191 ctx->valid = ngx_time() + (r->valid ? r->valid : 10);
5474
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
3192 next = ctx->next;
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
3193
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
3194 ctx->handler(ctx);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3195 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3196
5920
7420068c4d4b Resolver: fixed use-after-free memory access.
Ruslan Ermilov <ru@nginx.com>
parents: 5820
diff changeset
3197 ngx_resolver_free_node(r, rn);
7420068c4d4b Resolver: fixed use-after-free memory access.
Ruslan Ermilov <ru@nginx.com>
parents: 5820
diff changeset
3198
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3199 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3200 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3201
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3202 i += sizeof(ngx_resolver_qs_t);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3203
6371
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3204 for (a = 0; a < nan; a++) {
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3205
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3206 start = i;
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3207
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3208 while (i < n) {
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3209
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3210 if (buf[i] & 0xc0) {
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3211 i += 2;
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3212 goto found;
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3213 }
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3214
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3215 if (buf[i] == 0) {
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3216 i++;
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3217 goto test_length;
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3218 }
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3219
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3220 i += 1 + buf[i];
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3221 }
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3222
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3223 goto short_response;
6371
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3224
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3225 test_length:
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3226
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3227 if (i - start < 2) {
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3228 err = "invalid name in DNS response";
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3229 goto invalid;
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3230 }
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3231
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3232 found:
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3233
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3234 if (i + sizeof(ngx_resolver_an_t) >= n) {
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3235 goto short_response;
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3236 }
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3237
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3238 an = (ngx_resolver_an_t *) &buf[i];
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3239
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3240 type = (an->type_hi << 8) + an->type_lo;
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3241 class = (an->class_hi << 8) + an->class_lo;
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3242 len = (an->len_hi << 8) + an->len_lo;
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3243 ttl = (an->ttl[0] << 24) + (an->ttl[1] << 16)
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3244 + (an->ttl[2] << 8) + (an->ttl[3]);
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3245
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3246 if (class != 1) {
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3247 ngx_log_error(r->log_level, r->log, 0,
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3248 "unexpected RR class %ui", class);
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3249 goto failed;
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3250 }
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3251
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3252 if (ttl < 0) {
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3253 ttl = 0;
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3254 }
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3255
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3256 ngx_log_debug3(NGX_LOG_DEBUG_CORE, r->log, 0,
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3257 "resolver qt:%ui cl:%ui len:%uz",
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3258 type, class, len);
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3259
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3260 i += sizeof(ngx_resolver_an_t);
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3261
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3262 switch (type) {
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3263
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3264 case NGX_RESOLVE_PTR:
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3265
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3266 goto ptr;
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3267
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3268 case NGX_RESOLVE_CNAME:
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3269
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3270 break;
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3271
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3272 default:
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3273
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3274 ngx_log_error(r->log_level, r->log, 0,
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3275 "unexpected RR type %ui", type);
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3276 }
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3277
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3278 i += len;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3279 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3280
6371
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3281 /* unlock addr mutex */
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3282
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3283 ngx_log_error(r->log_level, r->log, 0,
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3284 "no PTR type in DNS response");
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3285 return;
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3286
33c4d319f08f Resolver: improved PTR response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 6370
diff changeset
3287 ptr:
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3288
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
3289 if (ngx_resolver_copy(r, &name, buf, buf + i, buf + n) != NGX_OK) {
5472
ab493c60d9ff Resolver: fixes in PTR processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5471
diff changeset
3290 goto failed;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3291 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3292
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3293 ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0, "resolver an:%V", &name);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3294
2486
8de5dc3e7001 use length of uncompressed name
Igor Sysoev <igor@sysoev.ru>
parents: 2484
diff changeset
3295 if (name.len != (size_t) rn->nlen
8de5dc3e7001 use length of uncompressed name
Igor Sysoev <igor@sysoev.ru>
parents: 2484
diff changeset
3296 || ngx_strncmp(name.data, rn->name, name.len) != 0)
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3297 {
2482
30ec8c5ac75b fix reverse resolving cache: it stored zero length names
Igor Sysoev <igor@sysoev.ru>
parents: 2314
diff changeset
3298 if (rn->nlen) {
30ec8c5ac75b fix reverse resolving cache: it stored zero length names
Igor Sysoev <igor@sysoev.ru>
parents: 2314
diff changeset
3299 ngx_resolver_free(r, rn->name);
30ec8c5ac75b fix reverse resolving cache: it stored zero length names
Igor Sysoev <igor@sysoev.ru>
parents: 2314
diff changeset
3300 }
30ec8c5ac75b fix reverse resolving cache: it stored zero length names
Igor Sysoev <igor@sysoev.ru>
parents: 2314
diff changeset
3301
2490
1c87647b7ca5 fix building by msvc, introduced in r2487
Igor Sysoev <igor@sysoev.ru>
parents: 2487
diff changeset
3302 rn->nlen = (u_short) name.len;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3303 rn->name = name.data;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3304
2486
8de5dc3e7001 use length of uncompressed name
Igor Sysoev <igor@sysoev.ru>
parents: 2484
diff changeset
3305 name.data = ngx_resolver_dup(r, rn->name, name.len);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3306 if (name.data == NULL) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3307 goto failed;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3308 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3309 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3310
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3311 ngx_queue_remove(&rn->queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3312
4295
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
3313 rn->valid = ngx_time() + (r->valid ? r->valid : ttl);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3314 rn->expire = ngx_time() + r->expire;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3315
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3316 ngx_queue_insert_head(expire_queue, &rn->queue);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3317
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3318 next = rn->waiting;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3319 rn->waiting = NULL;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3320
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3321 /* unlock addr mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3322
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3323 while (next) {
5474
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
3324 ctx = next;
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
3325 ctx->state = NGX_OK;
6456
c94aba230a5a Resolver: introduced valid field in resolver responses.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6372
diff changeset
3326 ctx->valid = rn->valid;
5474
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
3327 ctx->name = name;
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
3328 next = ctx->next;
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
3329
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
3330 ctx->handler(ctx);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3331 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3332
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3333 ngx_resolver_free(r, name.data);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3334
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3335 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3336
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3337 short_response:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3338
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3339 err = "short DNS response";
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3340
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3341 invalid:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3342
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3343 /* unlock addr mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3344
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3345 ngx_log_error(r->log_level, r->log, 0, err);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3346
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3347 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3348
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3349 failed:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3350
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3351 /* unlock addr mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3352
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3353 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3354 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3355
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3356
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3357 static ngx_resolver_node_t *
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3358 ngx_resolver_lookup_name(ngx_resolver_t *r, ngx_str_t *name, uint32_t hash)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3359 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3360 ngx_int_t rc;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3361 ngx_rbtree_node_t *node, *sentinel;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3362 ngx_resolver_node_t *rn;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3363
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3364 node = r->name_rbtree.root;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3365 sentinel = r->name_rbtree.sentinel;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3366
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3367 while (node != sentinel) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3368
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3369 if (hash < node->key) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3370 node = node->left;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3371 continue;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3372 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3373
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3374 if (hash > node->key) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3375 node = node->right;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3376 continue;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3377 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3378
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3379 /* hash == node->key */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3380
5921
5004210e8c78 Resolver: fixed debug event logging.
Ruslan Ermilov <ru@nginx.com>
parents: 5920
diff changeset
3381 rn = ngx_resolver_node(node);
4497
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4496
diff changeset
3382
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4496
diff changeset
3383 rc = ngx_memn2cmp(name->data, rn->name, name->len, rn->nlen);
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4496
diff changeset
3384
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4496
diff changeset
3385 if (rc == 0) {
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4496
diff changeset
3386 return rn;
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4496
diff changeset
3387 }
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4496
diff changeset
3388
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4496
diff changeset
3389 node = (rc < 0) ? node->left : node->right;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3390 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3391
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3392 /* not found */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3393
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3394 return NULL;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3395 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3396
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3397
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3398 static ngx_resolver_node_t *
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3399 ngx_resolver_lookup_srv(ngx_resolver_t *r, ngx_str_t *name, uint32_t hash)
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3400 {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3401 ngx_int_t rc;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3402 ngx_rbtree_node_t *node, *sentinel;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3403 ngx_resolver_node_t *rn;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3404
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3405 node = r->srv_rbtree.root;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3406 sentinel = r->srv_rbtree.sentinel;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3407
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3408 while (node != sentinel) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3409
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3410 if (hash < node->key) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3411 node = node->left;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3412 continue;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3413 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3414
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3415 if (hash > node->key) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3416 node = node->right;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3417 continue;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3418 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3419
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3420 /* hash == node->key */
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3421
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3422 rn = ngx_resolver_node(node);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3423
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3424 rc = ngx_memn2cmp(name->data, rn->name, name->len, rn->nlen);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3425
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3426 if (rc == 0) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3427 return rn;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3428 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3429
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3430 node = (rc < 0) ? node->left : node->right;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3431 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3432
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3433 /* not found */
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3434
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3435 return NULL;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3436 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3437
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3438
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3439 static ngx_resolver_node_t *
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3440 ngx_resolver_lookup_addr(ngx_resolver_t *r, in_addr_t addr)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3441 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3442 ngx_rbtree_node_t *node, *sentinel;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3443
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3444 node = r->addr_rbtree.root;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3445 sentinel = r->addr_rbtree.sentinel;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3446
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3447 while (node != sentinel) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3448
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3449 if (addr < node->key) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3450 node = node->left;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3451 continue;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3452 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3453
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3454 if (addr > node->key) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3455 node = node->right;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3456 continue;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3457 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3458
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3459 /* addr == node->key */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3460
5921
5004210e8c78 Resolver: fixed debug event logging.
Ruslan Ermilov <ru@nginx.com>
parents: 5920
diff changeset
3461 return ngx_resolver_node(node);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3462 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3463
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3464 /* not found */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3465
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3466 return NULL;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3467 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3468
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3469
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3470 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3471
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3472 static ngx_resolver_node_t *
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3473 ngx_resolver_lookup_addr6(ngx_resolver_t *r, struct in6_addr *addr,
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3474 uint32_t hash)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3475 {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3476 ngx_int_t rc;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3477 ngx_rbtree_node_t *node, *sentinel;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3478 ngx_resolver_node_t *rn;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3479
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3480 node = r->addr6_rbtree.root;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3481 sentinel = r->addr6_rbtree.sentinel;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3482
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3483 while (node != sentinel) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3484
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3485 if (hash < node->key) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3486 node = node->left;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3487 continue;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3488 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3489
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3490 if (hash > node->key) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3491 node = node->right;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3492 continue;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3493 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3494
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3495 /* hash == node->key */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3496
5921
5004210e8c78 Resolver: fixed debug event logging.
Ruslan Ermilov <ru@nginx.com>
parents: 5920
diff changeset
3497 rn = ngx_resolver_node(node);
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3498
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3499 rc = ngx_memcmp(addr, &rn->addr6, 16);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3500
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3501 if (rc == 0) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3502 return rn;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3503 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3504
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3505 node = (rc < 0) ? node->left : node->right;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3506 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3507
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3508 /* not found */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3509
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3510 return NULL;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3511 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3512
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3513 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3514
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3515
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3516 static void
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3517 ngx_resolver_rbtree_insert_value(ngx_rbtree_node_t *temp,
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3518 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3519 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3520 ngx_rbtree_node_t **p;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3521 ngx_resolver_node_t *rn, *rn_temp;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3522
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3523 for ( ;; ) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3524
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3525 if (node->key < temp->key) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3526
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3527 p = &temp->left;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3528
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3529 } else if (node->key > temp->key) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3530
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3531 p = &temp->right;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3532
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3533 } else { /* node->key == temp->key */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3534
5921
5004210e8c78 Resolver: fixed debug event logging.
Ruslan Ermilov <ru@nginx.com>
parents: 5920
diff changeset
3535 rn = ngx_resolver_node(node);
5004210e8c78 Resolver: fixed debug event logging.
Ruslan Ermilov <ru@nginx.com>
parents: 5920
diff changeset
3536 rn_temp = ngx_resolver_node(temp);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3537
3143
ab6258e18099 fix resolver cache rbtree comparison
Igor Sysoev <igor@sysoev.ru>
parents: 3139
diff changeset
3538 p = (ngx_memn2cmp(rn->name, rn_temp->name, rn->nlen, rn_temp->nlen)
ab6258e18099 fix resolver cache rbtree comparison
Igor Sysoev <igor@sysoev.ru>
parents: 3139
diff changeset
3539 < 0) ? &temp->left : &temp->right;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3540 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3541
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3542 if (*p == sentinel) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3543 break;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3544 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3545
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3546 temp = *p;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3547 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3548
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3549 *p = node;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3550 node->parent = temp;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3551 node->left = sentinel;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3552 node->right = sentinel;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3553 ngx_rbt_red(node);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3554 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3555
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3556
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3557 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3558
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3559 static void
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3560 ngx_resolver_rbtree_insert_addr6_value(ngx_rbtree_node_t *temp,
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3561 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3562 {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3563 ngx_rbtree_node_t **p;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3564 ngx_resolver_node_t *rn, *rn_temp;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3565
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3566 for ( ;; ) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3567
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3568 if (node->key < temp->key) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3569
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3570 p = &temp->left;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3571
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3572 } else if (node->key > temp->key) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3573
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3574 p = &temp->right;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3575
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3576 } else { /* node->key == temp->key */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3577
5921
5004210e8c78 Resolver: fixed debug event logging.
Ruslan Ermilov <ru@nginx.com>
parents: 5920
diff changeset
3578 rn = ngx_resolver_node(node);
5004210e8c78 Resolver: fixed debug event logging.
Ruslan Ermilov <ru@nginx.com>
parents: 5920
diff changeset
3579 rn_temp = ngx_resolver_node(temp);
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3580
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3581 p = (ngx_memcmp(&rn->addr6, &rn_temp->addr6, 16)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3582 < 0) ? &temp->left : &temp->right;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3583 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3584
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3585 if (*p == sentinel) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3586 break;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3587 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3588
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3589 temp = *p;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3590 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3591
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3592 *p = node;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3593 node->parent = temp;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3594 node->left = sentinel;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3595 node->right = sentinel;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3596 ngx_rbt_red(node);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3597 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3598
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3599 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3600
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3601
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3602 static ngx_int_t
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
3603 ngx_resolver_create_name_query(ngx_resolver_t *r, ngx_resolver_node_t *rn,
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
3604 ngx_str_t *name)
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3605 {
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
3606 u_char *p, *s;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
3607 size_t len, nlen;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
3608 ngx_uint_t ident;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
3609 ngx_resolver_qs_t *qs;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
3610 ngx_resolver_hdr_t *query;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3611
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
3612 nlen = name->len ? (1 + name->len + 1) : 1;
3306
61bdaac6c668 fix resolving an empty name (".")
Igor Sysoev <igor@sysoev.ru>
parents: 3299
diff changeset
3613
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
3614 len = sizeof(ngx_resolver_hdr_t) + nlen + sizeof(ngx_resolver_qs_t);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3615
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3616 #if (NGX_HAVE_INET6)
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
3617 p = ngx_resolver_alloc(r, r->ipv6 ? len * 2 : len);
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3618 #else
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
3619 p = ngx_resolver_alloc(r, len);
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3620 #endif
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3621 if (p == NULL) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3622 return NGX_ERROR;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3623 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3624
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3625 rn->qlen = (u_short) len;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3626 rn->query = p;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3627
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3628 #if (NGX_HAVE_INET6)
5478
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
3629 if (r->ipv6) {
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
3630 rn->query6 = p + len;
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
3631 }
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3632 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3633
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
3634 query = (ngx_resolver_hdr_t *) p;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3635
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3636 ident = ngx_random();
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3637
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
3638 ngx_log_debug2(NGX_LOG_DEBUG_CORE, r->log, 0,
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
3639 "resolve: \"%V\" A %i", name, ident & 0xffff);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3640
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3641 query->ident_hi = (u_char) ((ident >> 8) & 0xff);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3642 query->ident_lo = (u_char) (ident & 0xff);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3643
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3644 /* recursion query */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3645 query->flags_hi = 1; query->flags_lo = 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3646
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3647 /* one question */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3648 query->nqs_hi = 0; query->nqs_lo = 1;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3649 query->nan_hi = 0; query->nan_lo = 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3650 query->nns_hi = 0; query->nns_lo = 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3651 query->nar_hi = 0; query->nar_lo = 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3652
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
3653 p += sizeof(ngx_resolver_hdr_t) + nlen;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3654
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3655 qs = (ngx_resolver_qs_t *) p;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3656
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3657 /* query type */
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3658 qs->type_hi = 0; qs->type_lo = NGX_RESOLVE_A;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3659
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
3660 /* IN query class */
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3661 qs->class_hi = 0; qs->class_lo = 1;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3662
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3663 /* convert "www.example.com" to "\3www\7example\3com\0" */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3664
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3665 len = 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3666 p--;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3667 *p-- = '\0';
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3668
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
3669 if (name->len == 0) {
4610
778d2cc03e22 Fixed segmentation fault in ngx_resolver_create_name_query().
Ruslan Ermilov <ru@nginx.com>
parents: 4556
diff changeset
3670 return NGX_DECLINED;
778d2cc03e22 Fixed segmentation fault in ngx_resolver_create_name_query().
Ruslan Ermilov <ru@nginx.com>
parents: 4556
diff changeset
3671 }
778d2cc03e22 Fixed segmentation fault in ngx_resolver_create_name_query().
Ruslan Ermilov <ru@nginx.com>
parents: 4556
diff changeset
3672
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
3673 for (s = name->data + name->len - 1; s >= name->data; s--) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3674 if (*s != '.') {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3675 *p = *s;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3676 len++;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3677
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3678 } else {
4556
1bddc91e78d6 Resolver: added missing sanity checking when creating name queries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4497
diff changeset
3679 if (len == 0 || len > 255) {
1961
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
3680 return NGX_DECLINED;
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
3681 }
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
3682
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3683 *p = (u_char) len;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3684 len = 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3685 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3686
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3687 p--;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3688 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3689
4556
1bddc91e78d6 Resolver: added missing sanity checking when creating name queries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4497
diff changeset
3690 if (len == 0 || len > 255) {
1bddc91e78d6 Resolver: added missing sanity checking when creating name queries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4497
diff changeset
3691 return NGX_DECLINED;
1bddc91e78d6 Resolver: added missing sanity checking when creating name queries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4497
diff changeset
3692 }
1bddc91e78d6 Resolver: added missing sanity checking when creating name queries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4497
diff changeset
3693
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3694 *p = (u_char) len;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3695
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3696 #if (NGX_HAVE_INET6)
5478
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
3697 if (!r->ipv6) {
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
3698 return NGX_OK;
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
3699 }
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
3700
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3701 p = rn->query6;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3702
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3703 ngx_memcpy(p, rn->query, rn->qlen);
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3704
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3705 query = (ngx_resolver_hdr_t *) p;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3706
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3707 ident = ngx_random();
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3708
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
3709 ngx_log_debug2(NGX_LOG_DEBUG_CORE, r->log, 0,
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
3710 "resolve: \"%V\" AAAA %i", name, ident & 0xffff);
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3711
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3712 query->ident_hi = (u_char) ((ident >> 8) & 0xff);
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3713 query->ident_lo = (u_char) (ident & 0xff);
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3714
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3715 p += sizeof(ngx_resolver_hdr_t) + nlen;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3716
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3717 qs = (ngx_resolver_qs_t *) p;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3718
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3719 qs->type_lo = NGX_RESOLVE_AAAA;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3720 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3721
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3722 return NGX_OK;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3723 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3724
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3725
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3726 static ngx_int_t
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3727 ngx_resolver_create_srv_query(ngx_resolver_t *r, ngx_resolver_node_t *rn,
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3728 ngx_str_t *name)
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3729 {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3730 u_char *p, *s;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3731 size_t len, nlen;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3732 ngx_uint_t ident;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3733 ngx_resolver_qs_t *qs;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3734 ngx_resolver_hdr_t *query;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3735
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3736 nlen = name->len ? (1 + name->len + 1) : 1;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3737
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3738 len = sizeof(ngx_resolver_hdr_t) + nlen + sizeof(ngx_resolver_qs_t);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3739
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3740 p = ngx_resolver_alloc(r, len);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3741 if (p == NULL) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3742 return NGX_ERROR;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3743 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3744
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3745 rn->qlen = (u_short) len;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3746 rn->query = p;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3747
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3748 query = (ngx_resolver_hdr_t *) p;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3749
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3750 ident = ngx_random();
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3751
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3752 ngx_log_debug2(NGX_LOG_DEBUG_CORE, r->log, 0,
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3753 "resolve: \"%V\" SRV %i", name, ident & 0xffff);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3754
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3755 query->ident_hi = (u_char) ((ident >> 8) & 0xff);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3756 query->ident_lo = (u_char) (ident & 0xff);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3757
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3758 /* recursion query */
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3759 query->flags_hi = 1; query->flags_lo = 0;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3760
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3761 /* one question */
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3762 query->nqs_hi = 0; query->nqs_lo = 1;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3763 query->nan_hi = 0; query->nan_lo = 0;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3764 query->nns_hi = 0; query->nns_lo = 0;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3765 query->nar_hi = 0; query->nar_lo = 0;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3766
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3767 p += sizeof(ngx_resolver_hdr_t) + nlen;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3768
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3769 qs = (ngx_resolver_qs_t *) p;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3770
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3771 /* query type */
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3772 qs->type_hi = 0; qs->type_lo = NGX_RESOLVE_SRV;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3773
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3774 /* IN query class */
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3775 qs->class_hi = 0; qs->class_lo = 1;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3776
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3777 /* converts "www.example.com" to "\3www\7example\3com\0" */
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3778
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3779 len = 0;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3780 p--;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3781 *p-- = '\0';
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3782
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3783 if (name->len == 0) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3784 return NGX_DECLINED;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3785 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3786
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3787 for (s = name->data + name->len - 1; s >= name->data; s--) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3788 if (*s != '.') {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3789 *p = *s;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3790 len++;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3791
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3792 } else {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3793 if (len == 0 || len > 255) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3794 return NGX_DECLINED;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3795 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3796
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3797 *p = (u_char) len;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3798 len = 0;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3799 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3800
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3801 p--;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3802 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3803
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3804 if (len == 0 || len > 255) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3805 return NGX_DECLINED;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3806 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3807
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3808 *p = (u_char) len;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3809
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3810 return NGX_OK;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3811 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3812
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3813
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3814 static ngx_int_t
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
3815 ngx_resolver_create_addr_query(ngx_resolver_t *r, ngx_resolver_node_t *rn,
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
3816 ngx_resolver_addr_t *addr)
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3817 {
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3818 u_char *p, *d;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3819 size_t len;
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
3820 in_addr_t inaddr;
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3821 ngx_int_t n;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3822 ngx_uint_t ident;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3823 ngx_resolver_hdr_t *query;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3824 struct sockaddr_in *sin;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3825 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3826 struct sockaddr_in6 *sin6;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3827 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3828
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
3829 switch (addr->sockaddr->sa_family) {
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3830
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3831 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3832 case AF_INET6:
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3833 len = sizeof(ngx_resolver_hdr_t)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3834 + 64 + sizeof(".ip6.arpa.") - 1
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3835 + sizeof(ngx_resolver_qs_t);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3836
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3837 break;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3838 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3839
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3840 default: /* AF_INET */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3841 len = sizeof(ngx_resolver_hdr_t)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3842 + sizeof(".255.255.255.255.in-addr.arpa.") - 1
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3843 + sizeof(ngx_resolver_qs_t);
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
3844 }
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
3845
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
3846 p = ngx_resolver_alloc(r, len);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3847 if (p == NULL) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3848 return NGX_ERROR;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3849 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3850
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3851 rn->query = p;
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
3852 query = (ngx_resolver_hdr_t *) p;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3853
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3854 ident = ngx_random();
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3855
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3856 query->ident_hi = (u_char) ((ident >> 8) & 0xff);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3857 query->ident_lo = (u_char) (ident & 0xff);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3858
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3859 /* recursion query */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3860 query->flags_hi = 1; query->flags_lo = 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3861
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3862 /* one question */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3863 query->nqs_hi = 0; query->nqs_lo = 1;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3864 query->nan_hi = 0; query->nan_lo = 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3865 query->nns_hi = 0; query->nns_lo = 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3866 query->nar_hi = 0; query->nar_lo = 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3867
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
3868 p += sizeof(ngx_resolver_hdr_t);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3869
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
3870 switch (addr->sockaddr->sa_family) {
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3871
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3872 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3873 case AF_INET6:
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
3874 sin6 = (struct sockaddr_in6 *) addr->sockaddr;
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3875
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3876 for (n = 15; n >= 0; n--) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3877 p = ngx_sprintf(p, "\1%xd\1%xd",
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3878 sin6->sin6_addr.s6_addr[n] & 0xf,
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3879 (sin6->sin6_addr.s6_addr[n] >> 4) & 0xf);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3880 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3881
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3882 p = ngx_cpymem(p, "\3ip6\4arpa\0", 10);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3883
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3884 break;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3885 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3886
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3887 default: /* AF_INET */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3888
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
3889 sin = (struct sockaddr_in *) addr->sockaddr;
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
3890 inaddr = ntohl(sin->sin_addr.s_addr);
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3891
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3892 for (n = 0; n < 32; n += 8) {
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
3893 d = ngx_sprintf(&p[1], "%ud", (inaddr >> n) & 0xff);
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3894 *p = (u_char) (d - &p[1]);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3895 p = d;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3896 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3897
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3898 p = ngx_cpymem(p, "\7in-addr\4arpa\0", 14);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3899 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3900
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
3901 /* query type "PTR", IN query class */
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3902 p = ngx_cpymem(p, "\0\14\0\1", 4);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3903
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
3904 rn->qlen = (u_short) (p - rn->query);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3905
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3906 return NGX_OK;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3907 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3908
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3909
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3910 static ngx_int_t
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3911 ngx_resolver_copy(ngx_resolver_t *r, ngx_str_t *name, u_char *buf, u_char *src,
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3912 u_char *last)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3913 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3914 char *err;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3915 u_char *p, *dst;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3916 ssize_t len;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3917 ngx_uint_t i, n;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3918
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3919 p = src;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3920 len = -1;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3921
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3922 /*
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3923 * compression pointers allow to create endless loop, so we set limit;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3924 * 128 pointers should be enough to store 255-byte name
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3925 */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3926
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3927 for (i = 0; i < 128; i++) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3928 n = *p++;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3929
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3930 if (n == 0) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3931 goto done;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3932 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3933
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3934 if (n & 0xc0) {
2314
52987a023486 fix compression pointer for big (>255) DNS responses
Igor Sysoev <igor@sysoev.ru>
parents: 2282
diff changeset
3935 n = ((n & 0x3f) << 8) + *p;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3936 p = &buf[n];
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3937
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3938 } else {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3939 len += 1 + n;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3940 p = &p[n];
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3941 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3942
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3943 if (p >= last) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3944 err = "name is out of response";
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3945 goto invalid;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3946 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3947 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3948
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3949 err = "compression pointers loop";
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3950
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3951 invalid:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3952
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3953 ngx_log_error(r->log_level, r->log, 0, err);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3954
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3955 return NGX_ERROR;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3956
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3957 done:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3958
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3959 if (name == NULL) {
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3960 return NGX_OK;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3961 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3962
3298
847ab5a32307 fix "PTR ." case in address resolver
Igor Sysoev <igor@sysoev.ru>
parents: 3297
diff changeset
3963 if (len == -1) {
5764
f166c521b619 Style: use ngx_str_null().
Tatsuhiko Kubo <cubicdaiya@gmail.com>
parents: 5600
diff changeset
3964 ngx_str_null(name);
3298
847ab5a32307 fix "PTR ." case in address resolver
Igor Sysoev <igor@sysoev.ru>
parents: 3297
diff changeset
3965 return NGX_OK;
847ab5a32307 fix "PTR ." case in address resolver
Igor Sysoev <igor@sysoev.ru>
parents: 3297
diff changeset
3966 }
847ab5a32307 fix "PTR ." case in address resolver
Igor Sysoev <igor@sysoev.ru>
parents: 3297
diff changeset
3967
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3968 dst = ngx_resolver_alloc(r, len);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3969 if (dst == NULL) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3970 return NGX_ERROR;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3971 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3972
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3973 name->data = dst;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3974
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3975 n = *src++;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3976
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3977 for ( ;; ) {
4267
768212ca0745 Fixed compression pointer processing in DNS response greater than 255 bytes.
Igor Sysoev <igor@sysoev.ru>
parents: 4225
diff changeset
3978 if (n & 0xc0) {
768212ca0745 Fixed compression pointer processing in DNS response greater than 255 bytes.
Igor Sysoev <igor@sysoev.ru>
parents: 4225
diff changeset
3979 n = ((n & 0x3f) << 8) + *src;
768212ca0745 Fixed compression pointer processing in DNS response greater than 255 bytes.
Igor Sysoev <igor@sysoev.ru>
parents: 4225
diff changeset
3980 src = &buf[n];
768212ca0745 Fixed compression pointer processing in DNS response greater than 255 bytes.
Igor Sysoev <igor@sysoev.ru>
parents: 4225
diff changeset
3981
768212ca0745 Fixed compression pointer processing in DNS response greater than 255 bytes.
Igor Sysoev <igor@sysoev.ru>
parents: 4225
diff changeset
3982 n = *src++;
768212ca0745 Fixed compression pointer processing in DNS response greater than 255 bytes.
Igor Sysoev <igor@sysoev.ru>
parents: 4225
diff changeset
3983
768212ca0745 Fixed compression pointer processing in DNS response greater than 255 bytes.
Igor Sysoev <igor@sysoev.ru>
parents: 4225
diff changeset
3984 } else {
5479
c0d6eae5a1c5 Resolver: lookups are case-insensitive.
Ruslan Ermilov <ru@nginx.com>
parents: 5478
diff changeset
3985 ngx_strlow(dst, src, n);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3986 dst += n;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3987 src += n;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3988
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3989 n = *src++;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3990
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3991 if (n != 0) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3992 *dst++ = '.';
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3993 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3994 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3995
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3996 if (n == 0) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3997 name->len = dst - name->data;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3998 return NGX_OK;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3999 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4000 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4001 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4002
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4003
7051
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
4004 static ngx_int_t
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
4005 ngx_resolver_set_timeout(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx)
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
4006 {
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
4007 if (ctx->event || ctx->timeout == 0) {
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
4008 return NGX_OK;
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
4009 }
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
4010
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
4011 ctx->event = ngx_resolver_calloc(r, sizeof(ngx_event_t));
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
4012 if (ctx->event == NULL) {
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
4013 return NGX_ERROR;
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
4014 }
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
4015
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
4016 ctx->event->handler = ngx_resolver_timeout_handler;
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
4017 ctx->event->data = ctx;
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
4018 ctx->event->log = r->log;
7052
70e65bf8dfd7 Resolver: cancelable resend timer event.
Ruslan Ermilov <ru@nginx.com>
parents: 7051
diff changeset
4019 ctx->event->cancelable = ctx->cancelable;
7051
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
4020 ctx->ident = -1;
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
4021
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
4022 ngx_add_timer(ctx->event, ctx->timeout);
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
4023
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
4024 return NGX_OK;
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
4025 }
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
4026
137c5be7df09 Resolver: factored out setting a timer for resolver timeout.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7048
diff changeset
4027
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4028 static void
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4029 ngx_resolver_timeout_handler(ngx_event_t *ev)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4030 {
6348
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
4031 ngx_resolver_ctx_t *ctx;
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
4032
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
4033 ctx = ev->data;
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
4034
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
4035 ctx->state = NGX_RESOLVE_TIMEDOUT;
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
4036
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
4037 ctx->handler(ctx);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4038 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4039
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4040
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4041 static void
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4042 ngx_resolver_free_node(ngx_resolver_t *r, ngx_resolver_node_t *rn)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4043 {
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4044 ngx_uint_t i;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4045
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4046 /* lock alloc mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4047
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4048 if (rn->query) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4049 ngx_resolver_free_locked(r, rn->query);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4050 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4051
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4052 if (rn->name) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4053 ngx_resolver_free_locked(r, rn->name);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4054 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4055
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4056 if (rn->cnlen) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4057 ngx_resolver_free_locked(r, rn->u.cname);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4058 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4059
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4060 if (rn->naddrs > 1 && rn->naddrs != (u_short) -1) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4061 ngx_resolver_free_locked(r, rn->u.addrs);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4062 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4063
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4064 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4065 if (rn->naddrs6 > 1 && rn->naddrs6 != (u_short) -1) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4066 ngx_resolver_free_locked(r, rn->u6.addrs6);
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4067 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4068 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4069
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4070 if (rn->nsrvs) {
6860
f18c285c2e59 Win32: fixed some warnings reported by Borland C.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6847
diff changeset
4071 for (i = 0; i < (ngx_uint_t) rn->nsrvs; i++) {
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4072 if (rn->u.srvs[i].name.data) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4073 ngx_resolver_free_locked(r, rn->u.srvs[i].name.data);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4074 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4075 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4076
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4077 ngx_resolver_free_locked(r, rn->u.srvs);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4078 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4079
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4080 ngx_resolver_free_locked(r, rn);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4081
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4082 /* unlock alloc mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4083 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4084
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4085
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4086 static void *
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4087 ngx_resolver_alloc(ngx_resolver_t *r, size_t size)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4088 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4089 u_char *p;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4090
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4091 /* lock alloc mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4092
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4093 p = ngx_alloc(size, r->log);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4094
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4095 /* unlock alloc mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4096
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4097 return p;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4098 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4099
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4100
1903
1ea922585517 static ngx_resolver_calloc()
Igor Sysoev <igor@sysoev.ru>
parents: 1880
diff changeset
4101 static void *
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4102 ngx_resolver_calloc(ngx_resolver_t *r, size_t size)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4103 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4104 u_char *p;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4105
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4106 p = ngx_resolver_alloc(r, size);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4107
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4108 if (p) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4109 ngx_memzero(p, size);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4110 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4111
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4112 return p;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4113 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4114
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4115
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4116 static void
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4117 ngx_resolver_free(ngx_resolver_t *r, void *p)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4118 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4119 /* lock alloc mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4120
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4121 ngx_free(p);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4122
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4123 /* unlock alloc mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4124 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4125
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4126
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4127 static void
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4128 ngx_resolver_free_locked(ngx_resolver_t *r, void *p)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4129 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4130 ngx_free(p);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4131 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4132
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4133
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4134 static void *
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4135 ngx_resolver_dup(ngx_resolver_t *r, void *src, size_t size)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4136 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4137 void *dst;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4138
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4139 dst = ngx_resolver_alloc(r, size);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4140
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4141 if (dst == NULL) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4142 return dst;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4143 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4144
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4145 ngx_memcpy(dst, src, size);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4146
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4147 return dst;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4148 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4149
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4150
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4151 static ngx_resolver_addr_t *
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4152 ngx_resolver_export(ngx_resolver_t *r, ngx_resolver_node_t *rn,
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
4153 ngx_uint_t rotate)
4871
c85cefbdaafe Resolver: cached addresses are returned with random rotation now.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4784
diff changeset
4154 {
6559
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6509
diff changeset
4155 ngx_uint_t d, i, j, n;
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6509
diff changeset
4156 in_addr_t *addr;
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6509
diff changeset
4157 ngx_sockaddr_t *sockaddr;
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6509
diff changeset
4158 struct sockaddr_in *sin;
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6509
diff changeset
4159 ngx_resolver_addr_t *dst;
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4160 #if (NGX_HAVE_INET6)
6559
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6509
diff changeset
4161 struct in6_addr *addr6;
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6509
diff changeset
4162 struct sockaddr_in6 *sin6;
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4163 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4164
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4165 n = rn->naddrs;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4166 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4167 n += rn->naddrs6;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4168 #endif
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
4169
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4170 dst = ngx_resolver_calloc(r, n * sizeof(ngx_resolver_addr_t));
4892
063ac68d89dc Resolver: added missing memory allocation error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4871
diff changeset
4171 if (dst == NULL) {
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
4172 return NULL;
4892
063ac68d89dc Resolver: added missing memory allocation error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4871
diff changeset
4173 }
063ac68d89dc Resolver: added missing memory allocation error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4871
diff changeset
4174
6559
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6509
diff changeset
4175 sockaddr = ngx_resolver_calloc(r, n * sizeof(ngx_sockaddr_t));
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4176 if (sockaddr == NULL) {
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
4177 ngx_resolver_free(r, dst);
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
4178 return NULL;
4871
c85cefbdaafe Resolver: cached addresses are returned with random rotation now.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4784
diff changeset
4179 }
c85cefbdaafe Resolver: cached addresses are returned with random rotation now.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4784
diff changeset
4180
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4181 i = 0;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4182 d = rotate ? ngx_random() % n : 0;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4183
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4184 if (rn->naddrs) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4185 j = rotate ? ngx_random() % rn->naddrs : 0;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4186
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4187 addr = (rn->naddrs == 1) ? &rn->u.addr : rn->u.addrs;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4188
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4189 do {
6559
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6509
diff changeset
4190 sin = &sockaddr[d].sockaddr_in;
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4191 sin->sin_family = AF_INET;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4192 sin->sin_addr.s_addr = addr[j++];
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4193 dst[d].sockaddr = (struct sockaddr *) sin;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4194 dst[d++].socklen = sizeof(struct sockaddr_in);
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4195
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4196 if (d == n) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4197 d = 0;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4198 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4199
6860
f18c285c2e59 Win32: fixed some warnings reported by Borland C.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6847
diff changeset
4200 if (j == (ngx_uint_t) rn->naddrs) {
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4201 j = 0;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4202 }
6860
f18c285c2e59 Win32: fixed some warnings reported by Borland C.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6847
diff changeset
4203 } while (++i < (ngx_uint_t) rn->naddrs);
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
4204 }
4871
c85cefbdaafe Resolver: cached addresses are returned with random rotation now.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4784
diff changeset
4205
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4206 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4207 if (rn->naddrs6) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4208 j = rotate ? ngx_random() % rn->naddrs6 : 0;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4209
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4210 addr6 = (rn->naddrs6 == 1) ? &rn->u6.addr6 : rn->u6.addrs6;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4211
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4212 do {
6559
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6509
diff changeset
4213 sin6 = &sockaddr[d].sockaddr_in6;
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4214 sin6->sin6_family = AF_INET6;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4215 ngx_memcpy(sin6->sin6_addr.s6_addr, addr6[j++].s6_addr, 16);
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4216 dst[d].sockaddr = (struct sockaddr *) sin6;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4217 dst[d++].socklen = sizeof(struct sockaddr_in6);
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4218
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4219 if (d == n) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4220 d = 0;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4221 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4222
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4223 if (j == rn->naddrs6) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4224 j = 0;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4225 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4226 } while (++i < n);
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4227 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4228 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
4229
4871
c85cefbdaafe Resolver: cached addresses are returned with random rotation now.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4784
diff changeset
4230 return dst;
c85cefbdaafe Resolver: cached addresses are returned with random rotation now.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4784
diff changeset
4231 }
c85cefbdaafe Resolver: cached addresses are returned with random rotation now.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4784
diff changeset
4232
c85cefbdaafe Resolver: cached addresses are returned with random rotation now.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4784
diff changeset
4233
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4234 static void
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4235 ngx_resolver_report_srv(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx)
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4236 {
6460
034329824dd3 Win32: fixed build after 384154fc634f.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6458
diff changeset
4237 ngx_uint_t naddrs, nsrvs, nw, i, j, k, l, m, n, w;
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4238 ngx_resolver_addr_t *addrs;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4239 ngx_resolver_srv_name_t *srvs;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4240
7048
80224192163c Resolver: fixed possible use-after-free while resolving SRV.
Roman Arutyunyan <arut@nginx.com>
parents: 7040
diff changeset
4241 srvs = ctx->srvs;
80224192163c Resolver: fixed possible use-after-free while resolving SRV.
Roman Arutyunyan <arut@nginx.com>
parents: 7040
diff changeset
4242 nsrvs = ctx->nsrvs;
80224192163c Resolver: fixed possible use-after-free while resolving SRV.
Roman Arutyunyan <arut@nginx.com>
parents: 7040
diff changeset
4243
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4244 naddrs = 0;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4245
7048
80224192163c Resolver: fixed possible use-after-free while resolving SRV.
Roman Arutyunyan <arut@nginx.com>
parents: 7040
diff changeset
4246 for (i = 0; i < nsrvs; i++) {
80224192163c Resolver: fixed possible use-after-free while resolving SRV.
Roman Arutyunyan <arut@nginx.com>
parents: 7040
diff changeset
4247 if (srvs[i].state == NGX_ERROR) {
80224192163c Resolver: fixed possible use-after-free while resolving SRV.
Roman Arutyunyan <arut@nginx.com>
parents: 7040
diff changeset
4248 ctx->state = NGX_ERROR;
80224192163c Resolver: fixed possible use-after-free while resolving SRV.
Roman Arutyunyan <arut@nginx.com>
parents: 7040
diff changeset
4249 ctx->valid = ngx_time() + (r->valid ? r->valid : 10);
80224192163c Resolver: fixed possible use-after-free while resolving SRV.
Roman Arutyunyan <arut@nginx.com>
parents: 7040
diff changeset
4250
80224192163c Resolver: fixed possible use-after-free while resolving SRV.
Roman Arutyunyan <arut@nginx.com>
parents: 7040
diff changeset
4251 ctx->handler(ctx);
80224192163c Resolver: fixed possible use-after-free while resolving SRV.
Roman Arutyunyan <arut@nginx.com>
parents: 7040
diff changeset
4252 return;
80224192163c Resolver: fixed possible use-after-free while resolving SRV.
Roman Arutyunyan <arut@nginx.com>
parents: 7040
diff changeset
4253 }
80224192163c Resolver: fixed possible use-after-free while resolving SRV.
Roman Arutyunyan <arut@nginx.com>
parents: 7040
diff changeset
4254
80224192163c Resolver: fixed possible use-after-free while resolving SRV.
Roman Arutyunyan <arut@nginx.com>
parents: 7040
diff changeset
4255 naddrs += srvs[i].naddrs;
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4256 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4257
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4258 if (naddrs == 0) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4259 ctx->state = NGX_RESOLVE_NXDOMAIN;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4260 ctx->valid = ngx_time() + (r->valid ? r->valid : 10);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4261
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4262 ctx->handler(ctx);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4263 return;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4264 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4265
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4266 addrs = ngx_resolver_calloc(r, naddrs * sizeof(ngx_resolver_addr_t));
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4267 if (addrs == NULL) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4268 ctx->state = NGX_ERROR;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4269 ctx->valid = ngx_time() + (r->valid ? r->valid : 10);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4270
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4271 ctx->handler(ctx);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4272 return;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4273 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4274
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4275 i = 0;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4276 n = 0;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4277
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4278 do {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4279 nw = 0;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4280
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4281 for (j = i; j < nsrvs; j++) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4282 if (srvs[j].priority != srvs[i].priority) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4283 break;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4284 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4285
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4286 nw += srvs[j].naddrs * srvs[j].weight;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4287 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4288
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4289 if (nw == 0) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4290 goto next_srv;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4291 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4292
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4293 w = ngx_random() % nw;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4294
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4295 for (k = i; k < j; k++) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4296 if (w < srvs[k].naddrs * srvs[k].weight) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4297 break;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4298 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4299
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4300 w -= srvs[k].naddrs * srvs[k].weight;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4301 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4302
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4303 for (l = i; l < j; l++) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4304
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4305 for (m = 0; m < srvs[k].naddrs; m++) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4306 addrs[n].socklen = srvs[k].addrs[m].socklen;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4307 addrs[n].sockaddr = srvs[k].addrs[m].sockaddr;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4308 addrs[n].name = srvs[k].name;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4309 addrs[n].priority = srvs[k].priority;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4310 addrs[n].weight = srvs[k].weight;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4311 n++;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4312 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4313
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4314 if (++k == j) {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4315 k = i;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4316 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4317 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4318
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4319 next_srv:
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4320
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4321 i = j;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4322
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4323 } while (i < ctx->nsrvs);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4324
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4325 ctx->state = NGX_OK;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4326 ctx->addrs = addrs;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4327 ctx->naddrs = naddrs;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4328
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4329 ctx->handler(ctx);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4330
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4331 ngx_resolver_free(r, addrs);
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4332 }
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4333
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4334
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4335 char *
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4336 ngx_resolver_strerror(ngx_int_t err)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4337 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4338 static char *errors[] = {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4339 "Format error", /* FORMERR */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4340 "Server failure", /* SERVFAIL */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4341 "Host not found", /* NXDOMAIN */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4342 "Unimplemented", /* NOTIMP */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4343 "Operation refused" /* REFUSED */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4344 };
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4345
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4346 if (err > 0 && err < 6) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4347 return errors[err - 1];
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4348 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4349
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4350 if (err == NGX_RESOLVE_TIMEDOUT) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4351 return "Operation timed out";
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4352 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4353
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4354 return "Unknown error";
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4355 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4356
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4357
3408
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
4358 static u_char *
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
4359 ngx_resolver_log_error(ngx_log_t *log, u_char *buf, size_t len)
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
4360 {
6365
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
4361 u_char *p;
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
4362 ngx_resolver_connection_t *rec;
3408
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
4363
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
4364 p = buf;
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
4365
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
4366 if (log->action) {
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
4367 p = ngx_snprintf(buf, len, " while %s", log->action);
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
4368 len -= p - buf;
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
4369 }
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
4370
6365
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
4371 rec = log->data;
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
4372
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
4373 if (rec) {
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
4374 p = ngx_snprintf(p, len, ", resolver: %V", &rec->server);
3408
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
4375 }
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
4376
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
4377 return p;
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
4378 }
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
4379
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
4380
6922
a72886067bbb Added missing static specifiers.
Eran Kornblau <erankor@gmail.com>
parents: 6860
diff changeset
4381 static ngx_int_t
6365
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
4382 ngx_udp_connect(ngx_resolver_connection_t *rec)
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4383 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4384 int rc;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4385 ngx_int_t event;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4386 ngx_event_t *rev, *wev;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4387 ngx_socket_t s;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4388 ngx_connection_t *c;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4389
6365
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
4390 s = ngx_socket(rec->sockaddr->sa_family, SOCK_DGRAM, 0);
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
4391
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
4392 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, &rec->log, 0, "UDP socket %d", s);
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4393
5360
3d2d3e1cf427 Win32: MinGW GCC compatibility.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4892
diff changeset
4394 if (s == (ngx_socket_t) -1) {
6365
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
4395 ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno,
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4396 ngx_socket_n " failed");
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4397 return NGX_ERROR;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4398 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4399
6365
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
4400 c = ngx_get_connection(s, &rec->log);
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4401
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4402 if (c == NULL) {
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4403 if (ngx_close_socket(s) == -1) {
6365
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
4404 ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno,
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4405 ngx_close_socket_n "failed");
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4406 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4407
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4408 return NGX_ERROR;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4409 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4410
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4411 if (ngx_nonblocking(s) == -1) {
6365
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
4412 ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno,
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4413 ngx_nonblocking_n " failed");
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4414
5582
545a4d393e2f Resolver: properly handle connect() failures.
Ruslan Ermilov <ru@nginx.com>
parents: 5505
diff changeset
4415 goto failed;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4416 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4417
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4418 rev = c->read;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4419 wev = c->write;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4420
6365
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
4421 rev->log = &rec->log;
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
4422 wev->log = &rec->log;
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
4423
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
4424 rec->udp = c;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4425
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4426 c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4427
6365
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
4428 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, &rec->log, 0,
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
4429 "connect to %V, fd:%d #%uA", &rec->server, s, c->number);
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
4430
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
4431 rc = connect(s, rec->sockaddr, rec->socklen);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4432
6125
4dc8e7b62216 Removed the obsolete aio module.
Ruslan Ermilov <ru@nginx.com>
parents: 5921
diff changeset
4433 /* TODO: iocp */
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4434
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4435 if (rc == -1) {
6365
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
4436 ngx_log_error(NGX_LOG_CRIT, &rec->log, ngx_socket_errno,
3408
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
4437 "connect() failed");
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4438
5582
545a4d393e2f Resolver: properly handle connect() failures.
Ruslan Ermilov <ru@nginx.com>
parents: 5505
diff changeset
4439 goto failed;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4440 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4441
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4442 /* UDP sockets are always ready to write */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4443 wev->ready = 1;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
4444
6126
adba26ff70b5 Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents: 6125
diff changeset
4445 event = (ngx_event_flags & NGX_USE_CLEAR_EVENT) ?
adba26ff70b5 Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents: 6125
diff changeset
4446 /* kqueue, epoll */ NGX_CLEAR_EVENT:
adba26ff70b5 Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents: 6125
diff changeset
4447 /* select, poll, /dev/poll */ NGX_LEVEL_EVENT;
adba26ff70b5 Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents: 6125
diff changeset
4448 /* eventport event type has no meaning: oneshot only */
adba26ff70b5 Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents: 6125
diff changeset
4449
adba26ff70b5 Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents: 6125
diff changeset
4450 if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) {
adba26ff70b5 Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents: 6125
diff changeset
4451 goto failed;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4452 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4453
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4454 return NGX_OK;
5582
545a4d393e2f Resolver: properly handle connect() failures.
Ruslan Ermilov <ru@nginx.com>
parents: 5505
diff changeset
4455
545a4d393e2f Resolver: properly handle connect() failures.
Ruslan Ermilov <ru@nginx.com>
parents: 5505
diff changeset
4456 failed:
545a4d393e2f Resolver: properly handle connect() failures.
Ruslan Ermilov <ru@nginx.com>
parents: 5505
diff changeset
4457
545a4d393e2f Resolver: properly handle connect() failures.
Ruslan Ermilov <ru@nginx.com>
parents: 5505
diff changeset
4458 ngx_close_connection(c);
6365
d35b4d590b2d Resolver: renamed UDP-specific structures, fields and variables.
Roman Arutyunyan <arut@nginx.com>
parents: 6352
diff changeset
4459 rec->udp = NULL;
5582
545a4d393e2f Resolver: properly handle connect() failures.
Ruslan Ermilov <ru@nginx.com>
parents: 5505
diff changeset
4460
545a4d393e2f Resolver: properly handle connect() failures.
Ruslan Ermilov <ru@nginx.com>
parents: 5505
diff changeset
4461 return NGX_ERROR;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4462 }
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4463
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4464
6922
a72886067bbb Added missing static specifiers.
Eran Kornblau <erankor@gmail.com>
parents: 6860
diff changeset
4465 static ngx_int_t
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4466 ngx_tcp_connect(ngx_resolver_connection_t *rec)
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4467 {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4468 int rc;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4469 ngx_int_t event;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4470 ngx_err_t err;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4471 ngx_uint_t level;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4472 ngx_socket_t s;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4473 ngx_event_t *rev, *wev;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4474 ngx_connection_t *c;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4475
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4476 s = ngx_socket(rec->sockaddr->sa_family, SOCK_STREAM, 0);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4477
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4478 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, &rec->log, 0, "TCP socket %d", s);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4479
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4480 if (s == (ngx_socket_t) -1) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4481 ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno,
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4482 ngx_socket_n " failed");
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4483 return NGX_ERROR;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4484 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4485
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4486 c = ngx_get_connection(s, &rec->log);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4487
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4488 if (c == NULL) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4489 if (ngx_close_socket(s) == -1) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4490 ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno,
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4491 ngx_close_socket_n "failed");
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4492 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4493
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4494 return NGX_ERROR;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4495 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4496
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4497 if (ngx_nonblocking(s) == -1) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4498 ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno,
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4499 ngx_nonblocking_n " failed");
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4500
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4501 goto failed;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4502 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4503
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4504 rev = c->read;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4505 wev = c->write;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4506
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4507 rev->log = &rec->log;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4508 wev->log = &rec->log;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4509
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4510 rec->tcp = c;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4511
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4512 c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4513
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4514 if (ngx_add_conn) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4515 if (ngx_add_conn(c) == NGX_ERROR) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4516 goto failed;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4517 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4518 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4519
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4520 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, &rec->log, 0,
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4521 "connect to %V, fd:%d #%uA", &rec->server, s, c->number);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4522
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4523 rc = connect(s, rec->sockaddr, rec->socklen);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4524
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4525 if (rc == -1) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4526 err = ngx_socket_errno;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4527
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4528
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4529 if (err != NGX_EINPROGRESS
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4530 #if (NGX_WIN32)
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4531 /* Winsock returns WSAEWOULDBLOCK (NGX_EAGAIN) */
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4532 && err != NGX_EAGAIN
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4533 #endif
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4534 )
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4535 {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4536 if (err == NGX_ECONNREFUSED
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4537 #if (NGX_LINUX)
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4538 /*
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4539 * Linux returns EAGAIN instead of ECONNREFUSED
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4540 * for unix sockets if listen queue is full
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4541 */
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4542 || err == NGX_EAGAIN
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4543 #endif
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4544 || err == NGX_ECONNRESET
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4545 || err == NGX_ENETDOWN
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4546 || err == NGX_ENETUNREACH
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4547 || err == NGX_EHOSTDOWN
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4548 || err == NGX_EHOSTUNREACH)
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4549 {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4550 level = NGX_LOG_ERR;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4551
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4552 } else {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4553 level = NGX_LOG_CRIT;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4554 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4555
7275
e15bf978447e Resolver: style.
Ruslan Ermilov <ru@nginx.com>
parents: 7052
diff changeset
4556 ngx_log_error(level, &rec->log, err, "connect() to %V failed",
6367
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4557 &rec->server);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4558
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4559 ngx_close_connection(c);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4560 rec->tcp = NULL;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4561
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4562 return NGX_ERROR;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4563 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4564 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4565
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4566 if (ngx_add_conn) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4567 if (rc == -1) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4568
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4569 /* NGX_EINPROGRESS */
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4570
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4571 return NGX_AGAIN;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4572 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4573
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4574 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, &rec->log, 0, "connected");
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4575
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4576 wev->ready = 1;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4577
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4578 return NGX_OK;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4579 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4580
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4581 if (ngx_event_flags & NGX_USE_IOCP_EVENT) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4582
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4583 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, &rec->log, ngx_socket_errno,
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4584 "connect(): %d", rc);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4585
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4586 if (ngx_blocking(s) == -1) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4587 ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno,
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4588 ngx_blocking_n " failed");
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4589 goto failed;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4590 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4591
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4592 /*
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4593 * FreeBSD's aio allows to post an operation on non-connected socket.
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4594 * NT does not support it.
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4595 *
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4596 * TODO: check in Win32, etc. As workaround we can use NGX_ONESHOT_EVENT
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4597 */
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4598
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4599 rev->ready = 1;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4600 wev->ready = 1;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4601
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4602 return NGX_OK;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4603 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4604
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4605 if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4606
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4607 /* kqueue */
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4608
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4609 event = NGX_CLEAR_EVENT;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4610
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4611 } else {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4612
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4613 /* select, poll, /dev/poll */
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4614
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4615 event = NGX_LEVEL_EVENT;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4616 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4617
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4618 if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4619 goto failed;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4620 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4621
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4622 if (rc == -1) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4623
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4624 /* NGX_EINPROGRESS */
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4625
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4626 if (ngx_add_event(wev, NGX_WRITE_EVENT, event) != NGX_OK) {
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4627 goto failed;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4628 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4629
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4630 return NGX_AGAIN;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4631 }
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4632
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4633 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, &rec->log, 0, "connected");
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4634
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4635 wev->ready = 1;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4636
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4637 return NGX_OK;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4638
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4639 failed:
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4640
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4641 ngx_close_connection(c);
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4642 rec->tcp = NULL;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4643
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4644 return NGX_ERROR;
5a16d40c63de Resolver: TCP support.
Roman Arutyunyan <arut@nginx.com>
parents: 6366
diff changeset
4645 }
6458
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4646
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4647
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4648 static ngx_int_t
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4649 ngx_resolver_cmp_srvs(const void *one, const void *two)
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4650 {
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4651 ngx_int_t p1, p2;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4652 ngx_resolver_srv_t *first, *second;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4653
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4654 first = (ngx_resolver_srv_t *) one;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4655 second = (ngx_resolver_srv_t *) two;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4656
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4657 p1 = first->priority;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4658 p2 = second->priority;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4659
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4660 return p1 - p2;
384154fc634f Resolver: added support for SRV records.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6457
diff changeset
4661 }