annotate src/core/ngx_resolver.c @ 6351:497d0cff8ace

Resolver: fixed use-after-free memory accesses with CNAME. When several requests were waiting for a response, then after getting a CNAME response only the last request's context had the name updated. Contexts of other requests had the wrong name. This name was used by ngx_resolve_name_done() to find the node to remove the request context from. When the name was wrong, the request could not be properly cancelled, its context was freed but stayed linked to the node's waiting list. This happened e.g. when the first request was aborted or timed out before the resolving completed. When it completed, this triggered a use-after-free memory access by calling ctx->handler of already freed request context. The bug manifests itself by "could not cancel <name> resolving" alerts in error_log. When a request was responded with a CNAME, the request context kept the pointer to the original node's rn->u.cname. If the original node expired before the resolving timed out or completed with an error, this would trigger a use-after-free memory access via ctx->name in ctx->handler(). The fix is to keep ctx->name unmodified. The name from context is no longer used by ngx_resolve_name_done(). Instead, we now keep the pointer to resolver node to which this request is linked. Keeping the original name intact also improves logging.
author Roman Arutyunyan <arut@nginx.com>
date Tue, 26 Jan 2016 16:46:59 +0300
parents a5767988c022
children ff9b32c0e141
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
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
15
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
16 typedef struct {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
17 u_char ident_hi;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
18 u_char ident_lo;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
19 u_char flags_hi;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
20 u_char flags_lo;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
21 u_char nqs_hi;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
22 u_char nqs_lo;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
23 u_char nan_hi;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
24 u_char nan_lo;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
25 u_char nns_hi;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
26 u_char nns_lo;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
27 u_char nar_hi;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
28 u_char nar_lo;
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
29 } ngx_resolver_hdr_t;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
30
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
31
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
32 typedef struct {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
33 u_char type_hi;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
34 u_char type_lo;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
35 u_char class_hi;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
36 u_char class_lo;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
37 } ngx_resolver_qs_t;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
38
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
39
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
40 typedef struct {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
41 u_char type_hi;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
42 u_char type_lo;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
43 u_char class_hi;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
44 u_char class_lo;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
45 u_char ttl[4];
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
46 u_char len_hi;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
47 u_char len_lo;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
48 } ngx_resolver_an_t;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
49
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
50
5921
5004210e8c78 Resolver: fixed debug event logging.
Ruslan Ermilov <ru@nginx.com>
parents: 5920
diff changeset
51 #define ngx_resolver_node(n) \
5004210e8c78 Resolver: fixed debug event logging.
Ruslan Ermilov <ru@nginx.com>
parents: 5920
diff changeset
52 (ngx_resolver_node_t *) \
5004210e8c78 Resolver: fixed debug event logging.
Ruslan Ermilov <ru@nginx.com>
parents: 5920
diff changeset
53 ((u_char *) (n) - offsetof(ngx_resolver_node_t, node))
5004210e8c78 Resolver: fixed debug event logging.
Ruslan Ermilov <ru@nginx.com>
parents: 5920
diff changeset
54
5004210e8c78 Resolver: fixed debug event logging.
Ruslan Ermilov <ru@nginx.com>
parents: 5920
diff changeset
55
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
56 ngx_int_t ngx_udp_connect(ngx_udp_connection_t *uc);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
57
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
58
1906
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
59 static void ngx_resolver_cleanup(void *data);
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
60 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
61 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
62 ngx_resolver_ctx_t *ctx, ngx_str_t *name);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
63 static void ngx_resolver_expire(ngx_resolver_t *r, ngx_rbtree_t *tree,
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
64 ngx_queue_t *queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
65 static ngx_int_t ngx_resolver_send_query(ngx_resolver_t *r,
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
66 ngx_resolver_node_t *rn);
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
67 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
68 ngx_resolver_node_t *rn, ngx_str_t *name);
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
69 static ngx_int_t ngx_resolver_create_addr_query(ngx_resolver_t *r,
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
70 ngx_resolver_node_t *rn, ngx_addr_t *addr);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
71 static void ngx_resolver_resend_handler(ngx_event_t *ev);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
72 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
73 ngx_queue_t *queue);
6196
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
74 static ngx_uint_t ngx_resolver_resend_empty(ngx_resolver_t *r);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
75 static void ngx_resolver_read_response(ngx_event_t *rev);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
76 static void ngx_resolver_process_response(ngx_resolver_t *r, u_char *buf,
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
77 size_t n);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
78 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
79 ngx_uint_t ident, ngx_uint_t code, ngx_uint_t qtype,
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
80 ngx_uint_t nan, ngx_uint_t ans);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
81 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
82 ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
83 static ngx_resolver_node_t *ngx_resolver_lookup_name(ngx_resolver_t *r,
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
84 ngx_str_t *name, uint32_t hash);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
85 static ngx_resolver_node_t *ngx_resolver_lookup_addr(ngx_resolver_t *r,
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
86 in_addr_t addr);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
87 static void ngx_resolver_rbtree_insert_value(ngx_rbtree_node_t *temp,
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
88 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
89 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
90 u_char *buf, u_char *src, u_char *last);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
91 static void ngx_resolver_timeout_handler(ngx_event_t *ev);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
92 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
93 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
94 static void *ngx_resolver_calloc(ngx_resolver_t *r, size_t size);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
95 static void ngx_resolver_free(ngx_resolver_t *r, void *p);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
96 static void ngx_resolver_free_locked(ngx_resolver_t *r, void *p);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
97 static void *ngx_resolver_dup(ngx_resolver_t *r, void *src, size_t size);
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
98 static ngx_addr_t *ngx_resolver_export(ngx_resolver_t *r,
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
99 ngx_resolver_node_t *rn, ngx_uint_t rotate);
3408
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
100 static u_char *ngx_resolver_log_error(ngx_log_t *log, u_char *buf, size_t len);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
101
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
102 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
103 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
104 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
105 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
106 struct in6_addr *addr, uint32_t hash);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
107 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
108
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
109
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
110 ngx_resolver_t *
4225
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
111 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
112 {
4295
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
113 ngx_str_t s;
4225
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
114 ngx_url_t u;
4684
f5c2c9d656f9 When "resolver" is configured with a domain name, only the first
Ruslan Ermilov <ru@nginx.com>
parents: 4683
diff changeset
115 ngx_uint_t i, j;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
116 ngx_resolver_t *r;
1906
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
117 ngx_pool_cleanup_t *cln;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
118 ngx_udp_connection_t *uc;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
119
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
120 cln = ngx_pool_cleanup_add(cf->pool, 0);
1906
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
121 if (cln == NULL) {
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
122 return NULL;
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
123 }
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
124
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
125 cln->handler = ngx_resolver_cleanup;
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
126
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
127 r = ngx_calloc(sizeof(ngx_resolver_t), cf->log);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
128 if (r == NULL) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
129 return NULL;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
130 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
131
1906
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
132 cln->data = r;
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
133
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
134 r->event = ngx_calloc(sizeof(ngx_event_t), cf->log);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
135 if (r->event == NULL) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
136 return NULL;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
137 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
138
1687
568d432effb9 use ngx_rbtree_init()
Igor Sysoev <igor@sysoev.ru>
parents: 1685
diff changeset
139 ngx_rbtree_init(&r->name_rbtree, &r->name_sentinel,
568d432effb9 use ngx_rbtree_init()
Igor Sysoev <igor@sysoev.ru>
parents: 1685
diff changeset
140 ngx_resolver_rbtree_insert_value);
568d432effb9 use ngx_rbtree_init()
Igor Sysoev <igor@sysoev.ru>
parents: 1685
diff changeset
141
568d432effb9 use ngx_rbtree_init()
Igor Sysoev <igor@sysoev.ru>
parents: 1685
diff changeset
142 ngx_rbtree_init(&r->addr_rbtree, &r->addr_sentinel,
568d432effb9 use ngx_rbtree_init()
Igor Sysoev <igor@sysoev.ru>
parents: 1685
diff changeset
143 ngx_rbtree_insert_value);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
144
1685
a24c909ad879 use ngx_queue_init()
Igor Sysoev <igor@sysoev.ru>
parents: 1683
diff changeset
145 ngx_queue_init(&r->name_resend_queue);
a24c909ad879 use ngx_queue_init()
Igor Sysoev <igor@sysoev.ru>
parents: 1683
diff changeset
146 ngx_queue_init(&r->addr_resend_queue);
a24c909ad879 use ngx_queue_init()
Igor Sysoev <igor@sysoev.ru>
parents: 1683
diff changeset
147
a24c909ad879 use ngx_queue_init()
Igor Sysoev <igor@sysoev.ru>
parents: 1683
diff changeset
148 ngx_queue_init(&r->name_expire_queue);
a24c909ad879 use ngx_queue_init()
Igor Sysoev <igor@sysoev.ru>
parents: 1683
diff changeset
149 ngx_queue_init(&r->addr_expire_queue);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
150
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
151 #if (NGX_HAVE_INET6)
5478
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
152 r->ipv6 = 1;
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
153
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
154 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
155 ngx_resolver_rbtree_insert_addr6_value);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
156
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
157 ngx_queue_init(&r->addr6_resend_queue);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
158
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
159 ngx_queue_init(&r->addr6_expire_queue);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
160 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
161
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
162 r->event->handler = ngx_resolver_resend_handler;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
163 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
164 r->event->log = &cf->cycle->new_log;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
165 r->ident = -1;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
166
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
167 r->resend_timeout = 5;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
168 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
169 r->valid = 0;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
170
2785
d478379e51ac *) refactor error_log processing: listen socket log might inherit built-in
Igor Sysoev <igor@sysoev.ru>
parents: 2490
diff changeset
171 r->log = &cf->cycle->new_log;
3763
beca53d6ab3c decrease resolver errors level to error
Igor Sysoev <igor@sysoev.ru>
parents: 3642
diff changeset
172 r->log_level = NGX_LOG_ERR;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
173
4784
dd63abf20ba7 Resolver: fixed possible memory leak in ngx_resolver_create().
Maxim Dounin <mdounin@mdounin.ru>
parents: 4684
diff changeset
174 if (n) {
dd63abf20ba7 Resolver: fixed possible memory leak in ngx_resolver_create().
Maxim Dounin <mdounin@mdounin.ru>
parents: 4684
diff changeset
175 if (ngx_array_init(&r->udp_connections, cf->pool, n,
dd63abf20ba7 Resolver: fixed possible memory leak in ngx_resolver_create().
Maxim Dounin <mdounin@mdounin.ru>
parents: 4684
diff changeset
176 sizeof(ngx_udp_connection_t))
dd63abf20ba7 Resolver: fixed possible memory leak in ngx_resolver_create().
Maxim Dounin <mdounin@mdounin.ru>
parents: 4684
diff changeset
177 != NGX_OK)
dd63abf20ba7 Resolver: fixed possible memory leak in ngx_resolver_create().
Maxim Dounin <mdounin@mdounin.ru>
parents: 4684
diff changeset
178 {
dd63abf20ba7 Resolver: fixed possible memory leak in ngx_resolver_create().
Maxim Dounin <mdounin@mdounin.ru>
parents: 4684
diff changeset
179 return NULL;
dd63abf20ba7 Resolver: fixed possible memory leak in ngx_resolver_create().
Maxim Dounin <mdounin@mdounin.ru>
parents: 4684
diff changeset
180 }
dd63abf20ba7 Resolver: fixed possible memory leak in ngx_resolver_create().
Maxim Dounin <mdounin@mdounin.ru>
parents: 4684
diff changeset
181 }
dd63abf20ba7 Resolver: fixed possible memory leak in ngx_resolver_create().
Maxim Dounin <mdounin@mdounin.ru>
parents: 4684
diff changeset
182
4225
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
183 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
184 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
185 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
186 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
187
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
188 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
189
4474
41f640a693de Time parsing cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
190 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
191 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
192 "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
193 return NULL;
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
194 }
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
195
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
196 continue;
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
197 }
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
198
5478
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
199 #if (NGX_HAVE_INET6)
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
200 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
201
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
202 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
203 r->ipv6 = 1;
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
204
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
205 } 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
206 r->ipv6 = 0;
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
207
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
208 } else {
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
209 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
210 "invalid parameter: %V", &names[i]);
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
211 return NULL;
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
212 }
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
213
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
214 continue;
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
215 }
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
216 #endif
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
217
4225
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
218 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
219
4671
af9342747669 Support for IPv6 literals and an optional port in resolver.
Ruslan Ermilov <ru@nginx.com>
parents: 4653
diff changeset
220 u.url = names[i];
af9342747669 Support for IPv6 literals and an optional port in resolver.
Ruslan Ermilov <ru@nginx.com>
parents: 4653
diff changeset
221 u.default_port = 53;
af9342747669 Support for IPv6 literals and an optional port in resolver.
Ruslan Ermilov <ru@nginx.com>
parents: 4653
diff changeset
222
af9342747669 Support for IPv6 literals and an optional port in resolver.
Ruslan Ermilov <ru@nginx.com>
parents: 4653
diff changeset
223 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
224 if (u.err) {
bc5f881323b8 Fixed potential null pointer dereference in ngx_resolver_create().
Ruslan Ermilov <ru@nginx.com>
parents: 4619
diff changeset
225 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
226 "%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
227 u.err, &u.url);
4643
bc5f881323b8 Fixed potential null pointer dereference in ngx_resolver_create().
Ruslan Ermilov <ru@nginx.com>
parents: 4619
diff changeset
228 }
bc5f881323b8 Fixed potential null pointer dereference in ngx_resolver_create().
Ruslan Ermilov <ru@nginx.com>
parents: 4619
diff changeset
229
4225
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
230 return NULL;
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
231 }
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
232
4684
f5c2c9d656f9 When "resolver" is configured with a domain name, only the first
Ruslan Ermilov <ru@nginx.com>
parents: 4683
diff changeset
233 uc = ngx_array_push_n(&r->udp_connections, u.naddrs);
1683
1e0b028055ec allow to use IP addresses without defined resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1679
diff changeset
234 if (uc == NULL) {
1e0b028055ec allow to use IP addresses without defined resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1679
diff changeset
235 return NULL;
1e0b028055ec allow to use IP addresses without defined resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1679
diff changeset
236 }
1e0b028055ec allow to use IP addresses without defined resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1679
diff changeset
237
4684
f5c2c9d656f9 When "resolver" is configured with a domain name, only the first
Ruslan Ermilov <ru@nginx.com>
parents: 4683
diff changeset
238 ngx_memzero(uc, u.naddrs * sizeof(ngx_udp_connection_t));
f5c2c9d656f9 When "resolver" is configured with a domain name, only the first
Ruslan Ermilov <ru@nginx.com>
parents: 4683
diff changeset
239
f5c2c9d656f9 When "resolver" is configured with a domain name, only the first
Ruslan Ermilov <ru@nginx.com>
parents: 4683
diff changeset
240 for (j = 0; j < u.naddrs; j++) {
f5c2c9d656f9 When "resolver" is configured with a domain name, only the first
Ruslan Ermilov <ru@nginx.com>
parents: 4683
diff changeset
241 uc[j].sockaddr = u.addrs[j].sockaddr;
f5c2c9d656f9 When "resolver" is configured with a domain name, only the first
Ruslan Ermilov <ru@nginx.com>
parents: 4683
diff changeset
242 uc[j].socklen = u.addrs[j].socklen;
f5c2c9d656f9 When "resolver" is configured with a domain name, only the first
Ruslan Ermilov <ru@nginx.com>
parents: 4683
diff changeset
243 uc[j].server = u.addrs[j].name;
f5c2c9d656f9 When "resolver" is configured with a domain name, only the first
Ruslan Ermilov <ru@nginx.com>
parents: 4683
diff changeset
244 }
1683
1e0b028055ec allow to use IP addresses without defined resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1679
diff changeset
245 }
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
246
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
247 return r;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
248 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
249
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
250
1906
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
251 static void
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
252 ngx_resolver_cleanup(void *data)
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
253 {
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
254 ngx_resolver_t *r = data;
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
255
4225
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
256 ngx_uint_t i;
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
257 ngx_udp_connection_t *uc;
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
258
1906
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
259 if (r) {
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
260 ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
261 "cleanup resolver");
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
262
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
263 ngx_resolver_cleanup_tree(r, &r->name_rbtree);
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
264
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
265 ngx_resolver_cleanup_tree(r, &r->addr_rbtree);
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
266
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
267 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
268 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
269 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
270
1906
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
271 if (r->event) {
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
272 ngx_free(r->event);
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
273 }
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
274
4225
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
275
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
276 uc = r->udp_connections.elts;
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
277
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
278 for (i = 0; i < r->udp_connections.nelts; i++) {
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
279 if (uc[i].connection) {
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
280 ngx_close_connection(uc[i].connection);
1906
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
281 }
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
282 }
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
283
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
284 ngx_free(r);
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 }
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
287
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
288
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
289 static void
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
290 ngx_resolver_cleanup_tree(ngx_resolver_t *r, ngx_rbtree_t *tree)
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
291 {
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
292 ngx_resolver_ctx_t *ctx, *next;
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
293 ngx_resolver_node_t *rn;
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 while (tree->root != tree->sentinel) {
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
296
5921
5004210e8c78 Resolver: fixed debug event logging.
Ruslan Ermilov <ru@nginx.com>
parents: 5920
diff changeset
297 rn = ngx_resolver_node(ngx_rbtree_min(tree->root, tree->sentinel));
1906
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
298
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
299 ngx_queue_remove(&rn->queue);
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
300
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
301 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
302 next = ctx->next;
1906
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
303
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
304 if (ctx->event) {
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
305 ngx_resolver_free(r, ctx->event);
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
306 }
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
307
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
308 ngx_resolver_free(r, ctx);
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
309 }
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
310
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
311 ngx_rbtree_delete(tree, &rn->node);
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
312
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
313 ngx_resolver_free_node(r, rn);
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
314 }
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
315 }
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
316
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
317
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
318 ngx_resolver_ctx_t *
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
319 ngx_resolve_start(ngx_resolver_t *r, ngx_resolver_ctx_t *temp)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
320 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
321 in_addr_t addr;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
322 ngx_resolver_ctx_t *ctx;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
323
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
324 if (temp) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
325 addr = ngx_inet_addr(temp->name.data, temp->name.len);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
326
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
327 if (addr != INADDR_NONE) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
328 temp->resolver = r;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
329 temp->state = NGX_OK;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
330 temp->naddrs = 1;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
331 temp->addrs = &temp->addr;
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
332 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
333 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
334 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
335 temp->sin.sin_family = AF_INET;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
336 temp->sin.sin_addr.s_addr = addr;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
337 temp->quick = 1;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
338
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
339 return temp;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
340 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
341 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
342
4225
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
343 if (r->udp_connections.nelts == 0) {
1683
1e0b028055ec allow to use IP addresses without defined resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1679
diff changeset
344 return NGX_NO_RESOLVER;
1e0b028055ec allow to use IP addresses without defined resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1679
diff changeset
345 }
1e0b028055ec allow to use IP addresses without defined resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1679
diff changeset
346
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
347 ctx = ngx_resolver_calloc(r, sizeof(ngx_resolver_ctx_t));
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
348
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
349 if (ctx) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
350 ctx->resolver = r;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
351 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
352
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
353 return ctx;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
354 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
355
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
356
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
357 ngx_int_t
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
358 ngx_resolve_name(ngx_resolver_ctx_t *ctx)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
359 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
360 ngx_int_t rc;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
361 ngx_resolver_t *r;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
362
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
363 r = ctx->resolver;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
364
5505
d091d16ed398 Resolver: added support for domain names with a trailing dot.
Yichun Zhang <agentzh@gmail.com>
parents: 5485
diff changeset
365 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
366 ctx->name.len--;
d091d16ed398 Resolver: added support for domain names with a trailing dot.
Yichun Zhang <agentzh@gmail.com>
parents: 5485
diff changeset
367 }
d091d16ed398 Resolver: added support for domain names with a trailing dot.
Yichun Zhang <agentzh@gmail.com>
parents: 5485
diff changeset
368
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
369 ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0,
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
370 "resolve: \"%V\"", &ctx->name);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
371
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
372 if (ctx->quick) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
373 ctx->handler(ctx);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
374 return NGX_OK;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
375 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
376
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
377 /* lock name mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
378
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
379 rc = ngx_resolve_name_locked(r, ctx, &ctx->name);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
380
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
381 if (rc == NGX_OK) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
382 return NGX_OK;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
383 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
384
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
385 /* unlock name mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
386
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
387 if (rc == NGX_AGAIN) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
388 return NGX_OK;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
389 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
390
1904
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
391 /* NGX_ERROR */
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
392
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
393 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
394 ngx_resolver_free(r, ctx->event);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
395 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
396
1904
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
397 ngx_resolver_free(r, ctx);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
398
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
399 return NGX_ERROR;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
400 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
401
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
402
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
403 void
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
404 ngx_resolve_name_done(ngx_resolver_ctx_t *ctx)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
405 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
406 ngx_resolver_t *r;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
407 ngx_resolver_ctx_t *w, **p;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
408 ngx_resolver_node_t *rn;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
409
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
410 r = ctx->resolver;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
411
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
412 ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0,
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
413 "resolve name done: %i", ctx->state);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
414
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
415 if (ctx->quick) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
416 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
417 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
418
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
419 if (ctx->event && ctx->event->timer_set) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
420 ngx_del_timer(ctx->event);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
421 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
422
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
423 /* lock name mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
424
6348
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
425 if (ctx->state == NGX_AGAIN || ctx->state == NGX_RESOLVE_TIMEDOUT) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
426
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
427 rn = ctx->node;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
428
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
429 if (rn) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
430 p = &rn->waiting;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
431 w = rn->waiting;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
432
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
433 while (w) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
434 if (w == ctx) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
435 *p = w->next;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
436
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
437 goto done;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
438 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
439
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
440 p = &w->next;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
441 w = w->next;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
442 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
443 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
444
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
445 ngx_log_error(NGX_LOG_ALERT, r->log, 0,
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
446 "could not cancel %V resolving", &ctx->name);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
447 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
448
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
449 done:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
450
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
451 ngx_resolver_expire(r, &r->name_rbtree, &r->name_expire_queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
452
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
453 /* unlock name mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
454
1904
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
455 /* 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
456
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
457 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
458 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
459 }
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
460
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
461 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
462
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
463 /* unlock alloc mutex */
6196
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
464
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
465 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
466 ngx_del_timer(r->event);
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
467 }
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
468 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
469
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
470
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
471 static ngx_int_t
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
472 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
473 ngx_str_t *name)
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
474 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
475 uint32_t hash;
1961
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
476 ngx_int_t rc;
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
477 ngx_str_t cname;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
478 ngx_uint_t naddrs;
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
479 ngx_addr_t *addrs;
6349
978e79b95c9f Resolver: fixed CNAME processing for several requests.
Ruslan Ermilov <ru@nginx.com>
parents: 6348
diff changeset
480 ngx_resolver_ctx_t *next, *last;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
481 ngx_resolver_node_t *rn;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
482
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
483 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
484
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
485 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
486
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
487 rn = ngx_resolver_lookup_name(r, name, hash);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
488
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
489 if (rn) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
490
6349
978e79b95c9f Resolver: fixed CNAME processing for several requests.
Ruslan Ermilov <ru@nginx.com>
parents: 6348
diff changeset
491 /* 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
492 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
493
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
494 if (rn->valid >= ngx_time()) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
495
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
496 ngx_log_debug0(NGX_LOG_DEBUG_CORE, r->log, 0, "resolve cached");
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
497
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
498 ngx_queue_remove(&rn->queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
499
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
500 rn->expire = ngx_time() + r->expire;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
501
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
502 ngx_queue_insert_head(&r->name_expire_queue, &rn->queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
503
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
504 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
505 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
506 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
507 #endif
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
508
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
509 if (naddrs) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
510
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
511 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
512 addrs = NULL;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
513
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
514 } else {
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
515 addrs = ngx_resolver_export(r, rn, 1);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
516 if (addrs == NULL) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
517 return NGX_ERROR;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
518 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
519 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
520
6349
978e79b95c9f Resolver: fixed CNAME processing for several requests.
Ruslan Ermilov <ru@nginx.com>
parents: 6348
diff changeset
521 last->next = rn->waiting;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
522 rn->waiting = NULL;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
523
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
524 /* unlock name mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
525
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
526 do {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
527 ctx->state = NGX_OK;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
528 ctx->naddrs = naddrs;
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
529
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
530 if (addrs == NULL) {
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
531 ctx->addrs = &ctx->addr;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
532 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
533 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
534 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
535 ctx->sin.sin_family = AF_INET;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
536 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
537
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
538 } else {
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
539 ctx->addrs = addrs;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
540 }
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
541
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
542 next = ctx->next;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
543
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
544 ctx->handler(ctx);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
545
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
546 ctx = next;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
547 } while (ctx);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
548
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
549 if (addrs != NULL) {
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
550 ngx_resolver_free(r, addrs->sockaddr);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
551 ngx_resolver_free(r, addrs);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
552 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
553
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
554 return NGX_OK;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
555 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
556
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
557 /* NGX_RESOLVE_CNAME */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
558
1969
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
559 if (ctx->recursion++ < NGX_RESOLVER_MAX_RECURSION) {
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
560
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
561 cname.len = rn->cnlen;
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
562 cname.data = rn->u.cname;
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
563
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
564 return ngx_resolve_name_locked(r, ctx, &cname);
1969
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
565 }
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
566
6349
978e79b95c9f Resolver: fixed CNAME processing for several requests.
Ruslan Ermilov <ru@nginx.com>
parents: 6348
diff changeset
567 last->next = rn->waiting;
1969
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
568 rn->waiting = NULL;
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
569
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
570 /* unlock name mutex */
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
571
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
572 do {
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
573 ctx->state = NGX_RESOLVE_NXDOMAIN;
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
574 next = ctx->next;
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
575
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
576 ctx->handler(ctx);
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
577
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
578 ctx = next;
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
579 } while (ctx);
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
580
41fd9a2e0755 limit CNAME recursion
Igor Sysoev <igor@sysoev.ru>
parents: 1967
diff changeset
581 return NGX_OK;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
582 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
583
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
584 if (rn->waiting) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
585
6348
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
586 if (ctx->event == NULL) {
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
587 ctx->event = ngx_resolver_calloc(r, sizeof(ngx_event_t));
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
588 if (ctx->event == NULL) {
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
589 return NGX_ERROR;
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
590 }
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
591
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
592 ctx->event->handler = ngx_resolver_timeout_handler;
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
593 ctx->event->data = ctx;
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
594 ctx->event->log = r->log;
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
595 ctx->ident = -1;
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
596
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
597 ngx_add_timer(ctx->event, ctx->timeout);
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
598 }
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
599
6349
978e79b95c9f Resolver: fixed CNAME processing for several requests.
Ruslan Ermilov <ru@nginx.com>
parents: 6348
diff changeset
600 last->next = rn->waiting;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
601 rn->waiting = ctx;
3297
ebc5384479b4 fix segfault in resolver:
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
602 ctx->state = NGX_AGAIN;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
603
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
604 do {
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
605 ctx->node = rn;
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
606 ctx = ctx->next;
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
607 } while (ctx);
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
608
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
609 return NGX_AGAIN;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
610 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
611
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
612 ngx_queue_remove(&rn->queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
613
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
614 /* lock alloc mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
615
4619
3171ec7d0d05 Resolver: protection from duplicate responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4610
diff changeset
616 if (rn->query) {
3171ec7d0d05 Resolver: protection from duplicate responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4610
diff changeset
617 ngx_resolver_free_locked(r, rn->query);
3171ec7d0d05 Resolver: protection from duplicate responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4610
diff changeset
618 rn->query = NULL;
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
619 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
620 rn->query6 = NULL;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
621 #endif
4619
3171ec7d0d05 Resolver: protection from duplicate responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4610
diff changeset
622 }
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
623
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
624 if (rn->cnlen) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
625 ngx_resolver_free_locked(r, rn->u.cname);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
626 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
627
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
628 if (rn->naddrs > 1 && rn->naddrs != (u_short) -1) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
629 ngx_resolver_free_locked(r, rn->u.addrs);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
630 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
631
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
632 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
633 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
634 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
635 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
636 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
637
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
638 /* unlock alloc mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
639
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
640 } else {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
641
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
642 rn = ngx_resolver_alloc(r, sizeof(ngx_resolver_node_t));
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
643 if (rn == NULL) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
644 return NGX_ERROR;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
645 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
646
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
647 rn->name = ngx_resolver_dup(r, name->data, name->len);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
648 if (rn->name == NULL) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
649 ngx_resolver_free(r, rn);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
650 return NGX_ERROR;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
651 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
652
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
653 rn->node.key = hash;
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
654 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
655 rn->query = NULL;
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
656 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
657 rn->query6 = NULL;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
658 #endif
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
659
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
660 ngx_rbtree_insert(&r->name_rbtree, &rn->node);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
661 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
662
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
663 rc = ngx_resolver_create_name_query(r, rn, name);
1961
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
664
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
665 if (rc == NGX_ERROR) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
666 goto failed;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
667 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
668
1961
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
669 if (rc == NGX_DECLINED) {
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
670 ngx_rbtree_delete(&r->name_rbtree, &rn->node);
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
671
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
672 ngx_resolver_free(r, rn->query);
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
673 ngx_resolver_free(r, rn->name);
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
674 ngx_resolver_free(r, rn);
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
675
6349
978e79b95c9f Resolver: fixed CNAME processing for several requests.
Ruslan Ermilov <ru@nginx.com>
parents: 6348
diff changeset
676 do {
978e79b95c9f Resolver: fixed CNAME processing for several requests.
Ruslan Ermilov <ru@nginx.com>
parents: 6348
diff changeset
677 ctx->state = NGX_RESOLVE_NXDOMAIN;
978e79b95c9f Resolver: fixed CNAME processing for several requests.
Ruslan Ermilov <ru@nginx.com>
parents: 6348
diff changeset
678 next = ctx->next;
978e79b95c9f Resolver: fixed CNAME processing for several requests.
Ruslan Ermilov <ru@nginx.com>
parents: 6348
diff changeset
679
978e79b95c9f Resolver: fixed CNAME processing for several requests.
Ruslan Ermilov <ru@nginx.com>
parents: 6348
diff changeset
680 ctx->handler(ctx);
978e79b95c9f Resolver: fixed CNAME processing for several requests.
Ruslan Ermilov <ru@nginx.com>
parents: 6348
diff changeset
681
978e79b95c9f Resolver: fixed CNAME processing for several requests.
Ruslan Ermilov <ru@nginx.com>
parents: 6348
diff changeset
682 ctx = next;
978e79b95c9f Resolver: fixed CNAME processing for several requests.
Ruslan Ermilov <ru@nginx.com>
parents: 6348
diff changeset
683 } while (ctx);
1961
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
684
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
685 return NGX_OK;
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
686 }
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
687
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
688 rn->naddrs = (u_short) -1;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
689 #if (NGX_HAVE_INET6)
5478
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
690 rn->naddrs6 = r->ipv6 ? (u_short) -1 : 0;
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
691 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
692
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
693 if (ngx_resolver_send_query(r, rn) != NGX_OK) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
694 goto failed;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
695 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
696
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
697 if (ctx->event == NULL) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
698 ctx->event = ngx_resolver_calloc(r, sizeof(ngx_event_t));
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
699 if (ctx->event == NULL) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
700 goto failed;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
701 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
702
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
703 ctx->event->handler = ngx_resolver_timeout_handler;
6348
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
704 ctx->event->data = ctx;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
705 ctx->event->log = r->log;
6348
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
706 ctx->ident = -1;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
707
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
708 ngx_add_timer(ctx->event, ctx->timeout);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
709 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
710
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
711 if (ngx_queue_empty(&r->name_resend_queue)) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
712 ngx_add_timer(r->event, (ngx_msec_t) (r->resend_timeout * 1000));
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
713 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
714
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
715 rn->expire = ngx_time() + r->resend_timeout;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
716
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
717 ngx_queue_insert_head(&r->name_resend_queue, &rn->queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
718
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
719 rn->code = 0;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
720 rn->cnlen = 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
721 rn->valid = 0;
5485
8958656a8060 Resolver: use minimum TTL for caching (ticket #329).
Ruslan Ermilov <ru@nginx.com>
parents: 5479
diff changeset
722 rn->ttl = NGX_MAX_UINT32_VALUE;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
723 rn->waiting = ctx;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
724
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
725 ctx->state = NGX_AGAIN;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
726
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
727 do {
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
728 ctx->node = rn;
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
729 ctx = ctx->next;
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
730 } while (ctx);
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
731
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
732 return NGX_AGAIN;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
733
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
734 failed:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
735
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
736 ngx_rbtree_delete(&r->name_rbtree, &rn->node);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
737
1960
1609b3c3d604 fix memory leak on resolver query send failure
Igor Sysoev <igor@sysoev.ru>
parents: 1914
diff changeset
738 if (rn->query) {
1609b3c3d604 fix memory leak on resolver query send failure
Igor Sysoev <igor@sysoev.ru>
parents: 1914
diff changeset
739 ngx_resolver_free(r, rn->query);
1609b3c3d604 fix memory leak on resolver query send failure
Igor Sysoev <igor@sysoev.ru>
parents: 1914
diff changeset
740 }
1609b3c3d604 fix memory leak on resolver query send failure
Igor Sysoev <igor@sysoev.ru>
parents: 1914
diff changeset
741
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
742 ngx_resolver_free(r, rn->name);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
743
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
744 ngx_resolver_free(r, rn);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
745
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
746 return NGX_ERROR;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
747 }
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
748
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
749
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
750 ngx_int_t
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
751 ngx_resolve_addr(ngx_resolver_ctx_t *ctx)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
752 {
2484
cf3cd450049c store name pointer in variable allocated on stack
Igor Sysoev <igor@sysoev.ru>
parents: 2483
diff changeset
753 u_char *name;
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
754 in_addr_t addr;
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
755 ngx_queue_t *resend_queue, *expire_queue;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
756 ngx_rbtree_t *tree;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
757 ngx_resolver_t *r;
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
758 struct sockaddr_in *sin;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
759 ngx_resolver_node_t *rn;
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
760 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
761 uint32_t hash;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
762 struct sockaddr_in6 *sin6;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
763 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
764
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
765 #if (NGX_SUPPRESS_WARN)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
766 addr = 0;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
767 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
768 hash = 0;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
769 sin6 = NULL;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
770 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
771 #endif
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
772
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
773 r = ctx->resolver;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
774
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
775 switch (ctx->addr.sockaddr->sa_family) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
776
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
777 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
778 case AF_INET6:
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
779 sin6 = (struct sockaddr_in6 *) ctx->addr.sockaddr;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
780 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
781
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
782 /* lock addr mutex */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
783
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
784 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
785
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
786 tree = &r->addr6_rbtree;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
787 resend_queue = &r->addr6_resend_queue;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
788 expire_queue = &r->addr6_expire_queue;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
789
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
790 break;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
791 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
792
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
793 default: /* AF_INET */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
794 sin = (struct sockaddr_in *) ctx->addr.sockaddr;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
795 addr = ntohl(sin->sin_addr.s_addr);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
796
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
797 /* lock addr mutex */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
798
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
799 rn = ngx_resolver_lookup_addr(r, addr);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
800
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
801 tree = &r->addr_rbtree;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
802 resend_queue = &r->addr_resend_queue;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
803 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
804 }
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
805
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
806 if (rn) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
807
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
808 if (rn->valid >= ngx_time()) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
809
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
810 ngx_log_debug0(NGX_LOG_DEBUG_CORE, r->log, 0, "resolve cached");
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
811
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
812 ngx_queue_remove(&rn->queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
813
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
814 rn->expire = ngx_time() + r->expire;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
815
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
816 ngx_queue_insert_head(expire_queue, &rn->queue);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
817
2484
cf3cd450049c store name pointer in variable allocated on stack
Igor Sysoev <igor@sysoev.ru>
parents: 2483
diff changeset
818 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
819 if (name == NULL) {
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
2484
cf3cd450049c store name pointer in variable allocated on stack
Igor Sysoev <igor@sysoev.ru>
parents: 2483
diff changeset
823 ctx->name.len = rn->nlen;
cf3cd450049c store name pointer in variable allocated on stack
Igor Sysoev <igor@sysoev.ru>
parents: 2483
diff changeset
824 ctx->name.data = name;
cf3cd450049c store name pointer in variable allocated on stack
Igor Sysoev <igor@sysoev.ru>
parents: 2483
diff changeset
825
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
826 /* unlock addr mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
827
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
828 ctx->state = NGX_OK;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
829
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
830 ctx->handler(ctx);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
831
2484
cf3cd450049c store name pointer in variable allocated on stack
Igor Sysoev <igor@sysoev.ru>
parents: 2483
diff changeset
832 ngx_resolver_free(r, name);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
833
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
834 return NGX_OK;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
835 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
836
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
837 if (rn->waiting) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
838
6348
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
839 ctx->event = ngx_resolver_calloc(r, sizeof(ngx_event_t));
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
840 if (ctx->event == NULL) {
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
841 return NGX_ERROR;
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
842 }
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
843
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
844 ctx->event->handler = ngx_resolver_timeout_handler;
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
845 ctx->event->data = ctx;
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
846 ctx->event->log = r->log;
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
847 ctx->ident = -1;
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
848
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
849 ngx_add_timer(ctx->event, ctx->timeout);
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
850
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
851 ctx->next = rn->waiting;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
852 rn->waiting = ctx;
3297
ebc5384479b4 fix segfault in resolver:
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
853 ctx->state = NGX_AGAIN;
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
854 ctx->node = rn;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
855
2487
9b4dce95c744 fix return code, this fixes segfault when two or more
Igor Sysoev <igor@sysoev.ru>
parents: 2486
diff changeset
856 /* unlock addr mutex */
9b4dce95c744 fix return code, this fixes segfault when two or more
Igor Sysoev <igor@sysoev.ru>
parents: 2486
diff changeset
857
9b4dce95c744 fix return code, this fixes segfault when two or more
Igor Sysoev <igor@sysoev.ru>
parents: 2486
diff changeset
858 return NGX_OK;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
859 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
860
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
861 ngx_queue_remove(&rn->queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
862
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
863 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
864 rn->query = NULL;
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
865 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
866 rn->query6 = NULL;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
867 #endif
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
868
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
869 } else {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
870 rn = ngx_resolver_alloc(r, sizeof(ngx_resolver_node_t));
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
871 if (rn == NULL) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
872 goto failed;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
873 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
874
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
875 switch (ctx->addr.sockaddr->sa_family) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
876
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
877 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
878 case AF_INET6:
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
879 rn->addr6 = sin6->sin6_addr;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
880 rn->node.key = hash;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
881 break;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
882 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
883
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
884 default: /* AF_INET */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
885 rn->node.key = addr;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
886 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
887
1960
1609b3c3d604 fix memory leak on resolver query send failure
Igor Sysoev <igor@sysoev.ru>
parents: 1914
diff changeset
888 rn->query = NULL;
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
889 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
890 rn->query6 = NULL;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
891 #endif
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
892
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
893 ngx_rbtree_insert(tree, &rn->node);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
894 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
895
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
896 if (ngx_resolver_create_addr_query(r, rn, &ctx->addr) != NGX_OK) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
897 goto failed;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
898 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
899
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
900 rn->naddrs = (u_short) -1;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
901 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
902 rn->naddrs6 = (u_short) -1;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
903 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
904
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
905 if (ngx_resolver_send_query(r, rn) != NGX_OK) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
906 goto failed;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
907 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
908
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
909 ctx->event = ngx_resolver_calloc(r, sizeof(ngx_event_t));
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
910 if (ctx->event == NULL) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
911 goto failed;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
912 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
913
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
914 ctx->event->handler = ngx_resolver_timeout_handler;
6348
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
915 ctx->event->data = ctx;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
916 ctx->event->log = r->log;
6348
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
917 ctx->ident = -1;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
918
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
919 ngx_add_timer(ctx->event, ctx->timeout);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
920
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
921 if (ngx_queue_empty(resend_queue)) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
922 ngx_add_timer(r->event, (ngx_msec_t) (r->resend_timeout * 1000));
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
923 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
924
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
925 rn->expire = ngx_time() + r->resend_timeout;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
926
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
927 ngx_queue_insert_head(resend_queue, &rn->queue);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
928
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
929 rn->code = 0;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
930 rn->cnlen = 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
931 rn->name = NULL;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
932 rn->nlen = 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
933 rn->valid = 0;
5485
8958656a8060 Resolver: use minimum TTL for caching (ticket #329).
Ruslan Ermilov <ru@nginx.com>
parents: 5479
diff changeset
934 rn->ttl = NGX_MAX_UINT32_VALUE;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
935 rn->waiting = ctx;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
936
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
937 /* unlock addr mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
938
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
939 ctx->state = NGX_AGAIN;
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
940 ctx->node = rn;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
941
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
942 return NGX_OK;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
943
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
944 failed:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
945
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
946 if (rn) {
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
947 ngx_rbtree_delete(tree, &rn->node);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
948
1960
1609b3c3d604 fix memory leak on resolver query send failure
Igor Sysoev <igor@sysoev.ru>
parents: 1914
diff changeset
949 if (rn->query) {
1609b3c3d604 fix memory leak on resolver query send failure
Igor Sysoev <igor@sysoev.ru>
parents: 1914
diff changeset
950 ngx_resolver_free(r, rn->query);
1609b3c3d604 fix memory leak on resolver query send failure
Igor Sysoev <igor@sysoev.ru>
parents: 1914
diff changeset
951 }
1609b3c3d604 fix memory leak on resolver query send failure
Igor Sysoev <igor@sysoev.ru>
parents: 1914
diff changeset
952
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
953 ngx_resolver_free(r, rn);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
954 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
955
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
956 /* unlock addr mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
957
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
958 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
959 ngx_resolver_free(r, ctx->event);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
960 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
961
1904
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
962 ngx_resolver_free(r, ctx);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
963
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
964 return NGX_ERROR;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
965 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
966
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
967
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
968 void
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
969 ngx_resolve_addr_done(ngx_resolver_ctx_t *ctx)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
970 {
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
971 ngx_queue_t *expire_queue;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
972 ngx_rbtree_t *tree;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
973 ngx_resolver_t *r;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
974 ngx_resolver_ctx_t *w, **p;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
975 ngx_resolver_node_t *rn;
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
976
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
977 r = ctx->resolver;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
978
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
979 switch (ctx->addr.sockaddr->sa_family) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
980
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
981 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
982 case AF_INET6:
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
983 tree = &r->addr6_rbtree;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
984 expire_queue = &r->addr6_expire_queue;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
985 break;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
986 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
987
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
988 default: /* AF_INET */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
989 tree = &r->addr_rbtree;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
990 expire_queue = &r->addr_expire_queue;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
991 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
992
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
993 ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0,
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
994 "resolve addr done: %i", ctx->state);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
995
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
996 if (ctx->event && ctx->event->timer_set) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
997 ngx_del_timer(ctx->event);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
998 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
999
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1000 /* lock addr mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1001
6348
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
1002 if (ctx->state == NGX_AGAIN || ctx->state == NGX_RESOLVE_TIMEDOUT) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1003
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
1004 rn = ctx->node;
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 if (rn) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1007 p = &rn->waiting;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1008 w = rn->waiting;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1009
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1010 while (w) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1011 if (w == ctx) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1012 *p = w->next;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1013
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1014 goto done;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1015 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1016
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1017 p = &w->next;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1018 w = w->next;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1019 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1020 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1021
5476
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 u_char text[NGX_SOCKADDR_STRLEN];
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1024 ngx_str_t addrtext;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1025
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1026 addrtext.data = text;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1027 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
1028 text, NGX_SOCKADDR_STRLEN, 0);
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 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
1031 "could not cancel %V resolving", &addrtext);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1032 }
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1033 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1034
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1035 done:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1036
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1037 ngx_resolver_expire(r, tree, expire_queue);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1038
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1039 /* unlock addr mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1040
1904
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
1041 /* 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
1042
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
1043 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
1044 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
1045 }
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
1046
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
1047 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
1048
538f06aa8118 fix memory leaks, use unlocked ngx_resolver_free() for seldom failed cases
Igor Sysoev <igor@sysoev.ru>
parents: 1903
diff changeset
1049 /* unlock alloc mutex */
6196
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
1050
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
1051 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
1052 ngx_del_timer(r->event);
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
1053 }
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1054 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1055
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1056
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1057 static void
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1058 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
1059 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1060 time_t now;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1061 ngx_uint_t i;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1062 ngx_queue_t *q;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1063 ngx_resolver_node_t *rn;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1064
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1065 ngx_log_debug0(NGX_LOG_DEBUG_CORE, r->log, 0, "resolver expire");
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1066
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1067 now = ngx_time();
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1068
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1069 for (i = 0; i < 2; i++) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1070 if (ngx_queue_empty(queue)) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1071 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1072 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1073
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1074 q = ngx_queue_last(queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1075
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1076 rn = ngx_queue_data(q, ngx_resolver_node_t, queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1077
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1078 if (now <= rn->expire) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1079 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1080 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1081
1774
68d21fd1dc64 use %*s format
Igor Sysoev <igor@sysoev.ru>
parents: 1742
diff changeset
1082 ngx_log_debug2(NGX_LOG_DEBUG_CORE, r->log, 0,
68d21fd1dc64 use %*s format
Igor Sysoev <igor@sysoev.ru>
parents: 1742
diff changeset
1083 "resolver expire \"%*s\"", (size_t) rn->nlen, rn->name);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1084
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1085 ngx_queue_remove(q);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1086
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1087 ngx_rbtree_delete(tree, &rn->node);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1088
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1089 ngx_resolver_free_node(r, rn);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1090 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1091 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1092
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1093
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1094 static ngx_int_t
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1095 ngx_resolver_send_query(ngx_resolver_t *r, ngx_resolver_node_t *rn)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1096 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1097 ssize_t n;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1098 ngx_udp_connection_t *uc;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1099
4225
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
1100 uc = r->udp_connections.elts;
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
1101
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
1102 uc = &uc[r->last_connection++];
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
1103 if (r->last_connection == r->udp_connections.nelts) {
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
1104 r->last_connection = 0;
016352c19049 Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents: 3902
diff changeset
1105 }
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1106
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1107 if (uc->connection == NULL) {
4496
be6c250b827b Fixed null pointer dereference in resolver (ticket #91).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4474
diff changeset
1108
be6c250b827b Fixed null pointer dereference in resolver (ticket #91).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4474
diff changeset
1109 uc->log = *r->log;
be6c250b827b Fixed null pointer dereference in resolver (ticket #91).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4474
diff changeset
1110 uc->log.handler = ngx_resolver_log_error;
be6c250b827b Fixed null pointer dereference in resolver (ticket #91).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4474
diff changeset
1111 uc->log.data = uc;
be6c250b827b Fixed null pointer dereference in resolver (ticket #91).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4474
diff changeset
1112 uc->log.action = "resolving";
be6c250b827b Fixed null pointer dereference in resolver (ticket #91).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4474
diff changeset
1113
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1114 if (ngx_udp_connect(uc) != NGX_OK) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1115 return NGX_ERROR;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1116 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1117
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1118 uc->connection->data = r;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1119 uc->connection->read->handler = ngx_resolver_read_response;
1906
4a8c9139e579 cleanup resolver
Igor Sysoev <igor@sysoev.ru>
parents: 1904
diff changeset
1120 uc->connection->read->resolver = 1;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1121 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1122
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1123 if (rn->naddrs == (u_short) -1) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1124 n = ngx_send(uc->connection, rn->query, rn->qlen);
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1125
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1126 if (n == -1) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1127 return NGX_ERROR;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1128 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1129
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1130 if ((size_t) n != (size_t) rn->qlen) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1131 ngx_log_error(NGX_LOG_CRIT, &uc->log, 0, "send() incomplete");
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1132 return NGX_ERROR;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1133 }
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1134 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1135
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1136 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1137 if (rn->query6 && rn->naddrs6 == (u_short) -1) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1138 n = ngx_send(uc->connection, rn->query6, rn->qlen);
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1139
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1140 if (n == -1) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1141 return NGX_ERROR;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1142 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1143
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1144 if ((size_t) n != (size_t) rn->qlen) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1145 ngx_log_error(NGX_LOG_CRIT, &uc->log, 0, "send() incomplete");
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1146 return NGX_ERROR;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1147 }
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1148 }
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1149 #endif
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1150
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1151 return NGX_OK;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1152 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1153
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1154
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1155 static void
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1156 ngx_resolver_resend_handler(ngx_event_t *ev)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1157 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1158 time_t timer, atimer, ntimer;
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1159 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1160 time_t a6timer;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1161 #endif
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1162 ngx_resolver_t *r;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1163
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1164 r = ev->data;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1165
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1166 ngx_log_debug0(NGX_LOG_DEBUG_CORE, r->log, 0,
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1167 "resolver resend handler");
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1168
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1169 /* lock name mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1170
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1171 ntimer = ngx_resolver_resend(r, &r->name_rbtree, &r->name_resend_queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1172
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1173 /* unlock name mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1174
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1175 /* lock addr mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1176
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1177 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
1178
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1179 /* unlock addr mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1180
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1181 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1182
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1183 /* lock addr6 mutex */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1184
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1185 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
1186
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1187 /* unlock addr6 mutex */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1188
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1189 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1190
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1191 timer = ntimer;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1192
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1193 if (timer == 0) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1194 timer = atimer;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1195
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1196 } else if (atimer) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1197 timer = ngx_min(timer, atimer);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1198 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1199
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1200 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1201
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1202 if (timer == 0) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1203 timer = a6timer;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1204
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1205 } else if (a6timer) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1206 timer = ngx_min(timer, a6timer);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1207 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1208
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1209 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
1210
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1211 if (timer) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1212 ngx_add_timer(r->event, (ngx_msec_t) (timer * 1000));
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1213 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1214 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1215
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1216
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1217 static time_t
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1218 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
1219 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1220 time_t now;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1221 ngx_queue_t *q;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1222 ngx_resolver_node_t *rn;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1223
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1224 now = ngx_time();
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1225
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1226 for ( ;; ) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1227 if (ngx_queue_empty(queue)) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1228 return 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1229 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1230
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1231 q = ngx_queue_last(queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1232
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1233 rn = ngx_queue_data(q, ngx_resolver_node_t, queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1234
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1235 if (now < rn->expire) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1236 return rn->expire - now;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1237 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1238
1774
68d21fd1dc64 use %*s format
Igor Sysoev <igor@sysoev.ru>
parents: 1742
diff changeset
1239 ngx_log_debug3(NGX_LOG_DEBUG_CORE, r->log, 0,
68d21fd1dc64 use %*s format
Igor Sysoev <igor@sysoev.ru>
parents: 1742
diff changeset
1240 "resolver resend \"%*s\" %p",
68d21fd1dc64 use %*s format
Igor Sysoev <igor@sysoev.ru>
parents: 1742
diff changeset
1241 (size_t) rn->nlen, rn->name, rn->waiting);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1242
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1243 ngx_queue_remove(q);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1244
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1245 if (rn->waiting) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1246
4683
84d8e60b65f0 Fixed crash in ngx_resolver_cleanup_tree().
Ruslan Ermilov <ru@nginx.com>
parents: 4671
diff changeset
1247 (void) ngx_resolver_send_query(r, rn);
84d8e60b65f0 Fixed crash in ngx_resolver_cleanup_tree().
Ruslan Ermilov <ru@nginx.com>
parents: 4671
diff changeset
1248
84d8e60b65f0 Fixed crash in ngx_resolver_cleanup_tree().
Ruslan Ermilov <ru@nginx.com>
parents: 4671
diff changeset
1249 rn->expire = now + r->resend_timeout;
84d8e60b65f0 Fixed crash in ngx_resolver_cleanup_tree().
Ruslan Ermilov <ru@nginx.com>
parents: 4671
diff changeset
1250
84d8e60b65f0 Fixed crash in ngx_resolver_cleanup_tree().
Ruslan Ermilov <ru@nginx.com>
parents: 4671
diff changeset
1251 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
1252
cf4ee321d195 do not delete failed DNS request if there are waiting clients
Igor Sysoev <igor@sysoev.ru>
parents: 1878
diff changeset
1253 continue;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1254 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1255
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1256 ngx_rbtree_delete(tree, &rn->node);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1257
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1258 ngx_resolver_free_node(r, rn);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1259 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1260 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1261
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1262
6196
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
1263 static ngx_uint_t
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
1264 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
1265 {
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
1266 return ngx_queue_empty(&r->name_resend_queue)
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
1267 #if (NGX_HAVE_INET6)
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
1268 && 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
1269 #endif
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
1270 && 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
1271 }
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
1272
c3ec43580a48 Resolver: canceled resend timer on empty resend queues.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6126
diff changeset
1273
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1274 static void
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1275 ngx_resolver_read_response(ngx_event_t *rev)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1276 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1277 ssize_t n;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1278 ngx_connection_t *c;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1279 u_char buf[NGX_RESOLVER_UDP_SIZE];
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1280
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1281 c = rev->data;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1282
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1283 do {
1689
0b592a68aade ngx_udp_recv()
Igor Sysoev <igor@sysoev.ru>
parents: 1687
diff changeset
1284 n = ngx_udp_recv(c, buf, NGX_RESOLVER_UDP_SIZE);
0b592a68aade ngx_udp_recv()
Igor Sysoev <igor@sysoev.ru>
parents: 1687
diff changeset
1285
0b592a68aade ngx_udp_recv()
Igor Sysoev <igor@sysoev.ru>
parents: 1687
diff changeset
1286 if (n < 0) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1287 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1288 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1289
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1290 ngx_resolver_process_response(c->data, buf, n);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1291
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1292 } while (rev->ready);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1293 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1294
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1295
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1296 static void
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1297 ngx_resolver_process_response(ngx_resolver_t *r, u_char *buf, size_t n)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1298 {
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1299 char *err;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1300 ngx_uint_t i, times, ident, qident, flags, code, nqs, nan,
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1301 qtype, qclass;
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1302 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1303 ngx_uint_t qident6;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1304 #endif
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1305 ngx_queue_t *q;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1306 ngx_resolver_qs_t *qs;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1307 ngx_resolver_hdr_t *response;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1308 ngx_resolver_node_t *rn;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1309
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1310 if (n < sizeof(ngx_resolver_hdr_t)) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1311 goto short_response;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1312 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1313
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1314 response = (ngx_resolver_hdr_t *) buf;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1315
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1316 ident = (response->ident_hi << 8) + response->ident_lo;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1317 flags = (response->flags_hi << 8) + response->flags_lo;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1318 nqs = (response->nqs_hi << 8) + response->nqs_lo;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1319 nan = (response->nan_hi << 8) + response->nan_lo;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1320
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1321 ngx_log_debug6(NGX_LOG_DEBUG_CORE, r->log, 0,
4653
134ccdf44647 Resolver: fixed format specification.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4643
diff changeset
1322 "resolver DNS response %ui fl:%04Xui %ui/%ui/%ud/%ud",
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1323 ident, flags, nqs, nan,
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1324 (response->nns_hi << 8) + response->nns_lo,
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1325 (response->nar_hi << 8) + response->nar_lo);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1326
5470
aebdca7e8f8f Resolver: fixed response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5469
diff changeset
1327 /* response to a standard query */
aebdca7e8f8f Resolver: fixed response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5469
diff changeset
1328 if ((flags & 0xf870) != 0x8000) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1329 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
1330 "invalid DNS response %ui fl:%04Xui", ident, flags);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1331 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1332 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1333
5470
aebdca7e8f8f Resolver: fixed response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5469
diff changeset
1334 code = flags & 0xf;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1335
2282
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1336 if (code == NGX_RESOLVE_FORMERR) {
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1337
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1338 times = 0;
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1339
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1340 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
1341 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
1342 q = ngx_queue_next(q))
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1343 {
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1344 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
1345 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
1346
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1347 if (qident == ident) {
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1348 goto dns_error_name;
2282
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1349 }
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1350
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1351 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1352 if (rn->query6) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1353 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
1354
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1355 if (qident6 == ident) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1356 goto dns_error_name;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1357 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1358 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1359 #endif
2282
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1360 }
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1361
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1362 goto dns_error;
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1363 }
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1364
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1365 if (code > NGX_RESOLVE_REFUSED) {
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1366 goto dns_error;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1367 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1368
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1369 if (nqs != 1) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1370 err = "invalid number of questions in DNS response";
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1371 goto done;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1372 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1373
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1374 i = sizeof(ngx_resolver_hdr_t);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1375
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1376 while (i < (ngx_uint_t) n) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1377 if (buf[i] == '\0') {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1378 goto found;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1379 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1380
5470
aebdca7e8f8f Resolver: fixed response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5469
diff changeset
1381 i += 1 + buf[i];
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1382 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1383
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1384 goto short_response;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1385
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1386 found:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1387
5470
aebdca7e8f8f Resolver: fixed response processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5469
diff changeset
1388 if (i++ == sizeof(ngx_resolver_hdr_t)) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1389 err = "zero-length domain name in DNS response";
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1390 goto done;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1391 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1392
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1393 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
1394 > (ngx_uint_t) n)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1395 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1396 goto short_response;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1397 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1398
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1399 qs = (ngx_resolver_qs_t *) &buf[i];
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1400
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1401 qtype = (qs->type_hi << 8) + qs->type_lo;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1402 qclass = (qs->class_hi << 8) + qs->class_lo;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1403
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1404 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
1405 "resolver DNS response qt:%ui cl:%ui", qtype, qclass);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1406
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1407 if (qclass != 1) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1408 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
1409 "unknown query class %ui in DNS response", qclass);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1410 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1411 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1412
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1413 switch (qtype) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1414
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1415 case NGX_RESOLVE_A:
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1416 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1417 case NGX_RESOLVE_AAAA:
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1418 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1419
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1420 ngx_resolver_process_a(r, buf, n, ident, code, qtype, nan,
1742
268b81386fe4 no answers in DNS response should be NXDOMAIN
Igor Sysoev <igor@sysoev.ru>
parents: 1741
diff changeset
1421 i + sizeof(ngx_resolver_qs_t));
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1422
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1423 break;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1424
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1425 case NGX_RESOLVE_PTR:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1426
1742
268b81386fe4 no answers in DNS response should be NXDOMAIN
Igor Sysoev <igor@sysoev.ru>
parents: 1741
diff changeset
1427 ngx_resolver_process_ptr(r, buf, n, ident, code, nan);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1428
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1429 break;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1430
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1431 default:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1432 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
1433 "unknown query type %ui in DNS response", qtype);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1434 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1435 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1436
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1437 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1438
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1439 short_response:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1440
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1441 err = "short DNS response";
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1442
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1443 done:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1444
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1445 ngx_log_error(r->log_level, r->log, 0, err);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1446
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1447 return;
2282
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1448
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1449 dns_error_name:
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1450
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1451 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
1452 "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
1453 code, ngx_resolver_strerror(code), ident,
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1454 rn->nlen, rn->name);
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1455 return;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1456
2282
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1457 dns_error:
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1458
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1459 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
1460 "DNS error (%ui: %s), query id:%ui",
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1461 code, ngx_resolver_strerror(code), ident);
ec97eb9a8038 show name for a FORMERR DNS response
Igor Sysoev <igor@sysoev.ru>
parents: 2281
diff changeset
1462 return;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1463 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1464
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1465
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1466 static void
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1467 ngx_resolver_process_a(ngx_resolver_t *r, u_char *buf, size_t last,
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1468 ngx_uint_t ident, ngx_uint_t code, ngx_uint_t qtype,
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1469 ngx_uint_t nan, ngx_uint_t ans)
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1470 {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1471 char *err;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1472 u_char *cname;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1473 size_t len;
4295
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
1474 int32_t ttl;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1475 uint32_t hash;
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1476 in_addr_t *addr;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1477 ngx_str_t name;
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1478 ngx_addr_t *addrs;
5471
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
1479 ngx_uint_t type, class, qident, naddrs, a, i, n, start;
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1480 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1481 struct in6_addr *addr6;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1482 #endif
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1483 ngx_resolver_an_t *an;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1484 ngx_resolver_ctx_t *ctx, *next;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1485 ngx_resolver_node_t *rn;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1486
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1487 if (ngx_resolver_copy(r, &name, buf,
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1488 buf + sizeof(ngx_resolver_hdr_t), buf + last)
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1489 != NGX_OK)
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1490 {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1491 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1492 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1493
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1494 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
1495
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1496 hash = ngx_crc32_short(name.data, name.len);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1497
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1498 /* lock name mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1499
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1500 rn = ngx_resolver_lookup_name(r, &name, hash);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1501
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1502 if (rn == NULL) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1503 ngx_log_error(r->log_level, r->log, 0,
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1504 "unexpected response for %V", &name);
5471
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
1505 ngx_resolver_free(r, name.data);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1506 goto failed;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1507 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1508
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1509 switch (qtype) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1510
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1511 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1512 case NGX_RESOLVE_AAAA:
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1513
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1514 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
1515 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
1516 "unexpected response for %V", &name);
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1517 ngx_resolver_free(r, name.data);
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1518 goto failed;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1519 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1520
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1521 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
1522
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1523 break;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1524 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1525
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1526 default: /* NGX_RESOLVE_A */
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1527
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1528 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
1529 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
1530 "unexpected response for %V", &name);
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1531 ngx_resolver_free(r, name.data);
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1532 goto failed;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1533 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1534
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1535 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
1536 }
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1537
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1538 if (ident != qident) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1539 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
1540 "wrong ident %ui response for %V, expect %ui",
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1541 ident, &name, qident);
5471
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
1542 ngx_resolver_free(r, name.data);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1543 goto failed;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1544 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1545
3139
5f6144fc674d fix memory leak in resolver
Igor Sysoev <igor@sysoev.ru>
parents: 2785
diff changeset
1546 ngx_resolver_free(r, name.data);
5f6144fc674d fix memory leak in resolver
Igor Sysoev <igor@sysoev.ru>
parents: 2785
diff changeset
1547
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1548 if (code == 0 && rn->code) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1549 code = rn->code;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1550 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1551
1742
268b81386fe4 no answers in DNS response should be NXDOMAIN
Igor Sysoev <igor@sysoev.ru>
parents: 1741
diff changeset
1552 if (code == 0 && nan == 0) {
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1553
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1554 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1555 switch (qtype) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1556
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1557 case NGX_RESOLVE_AAAA:
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1558
5768
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
1559 rn->naddrs6 = 0;
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
1560
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1561 if (rn->naddrs == (u_short) -1) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1562 goto next;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1563 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1564
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1565 if (rn->naddrs) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1566 goto export;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1567 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1568
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1569 break;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1570
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1571 default: /* NGX_RESOLVE_A */
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1572
5768
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
1573 rn->naddrs = 0;
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
1574
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1575 if (rn->naddrs6 == (u_short) -1) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1576 goto next;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1577 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1578
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1579 if (rn->naddrs6) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1580 goto export;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1581 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1582 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1583 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1584
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1585 code = NGX_RESOLVE_NXDOMAIN;
1742
268b81386fe4 no answers in DNS response should be NXDOMAIN
Igor Sysoev <igor@sysoev.ru>
parents: 1741
diff changeset
1586 }
268b81386fe4 no answers in DNS response should be NXDOMAIN
Igor Sysoev <igor@sysoev.ru>
parents: 1741
diff changeset
1587
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1588 if (code) {
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1589
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1590 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1591 switch (qtype) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1592
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1593 case NGX_RESOLVE_AAAA:
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1594
5768
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
1595 rn->naddrs6 = 0;
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
1596
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1597 if (rn->naddrs == (u_short) -1) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1598 rn->code = (u_char) code;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1599 goto next;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1600 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1601
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1602 break;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1603
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1604 default: /* NGX_RESOLVE_A */
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1605
5768
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
1606 rn->naddrs = 0;
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
1607
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1608 if (rn->naddrs6 == (u_short) -1) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1609 rn->code = (u_char) code;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1610 goto next;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1611 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1612 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1613 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1614
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1615 next = rn->waiting;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1616 rn->waiting = NULL;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1617
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1618 ngx_queue_remove(&rn->queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1619
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1620 ngx_rbtree_delete(&r->name_rbtree, &rn->node);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1621
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1622 /* unlock name mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1623
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1624 while (next) {
5474
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
1625 ctx = next;
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
1626 ctx->state = code;
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
1627 next = ctx->next;
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
1628
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
1629 ctx->handler(ctx);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1630 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1631
5920
7420068c4d4b Resolver: fixed use-after-free memory access.
Ruslan Ermilov <ru@nginx.com>
parents: 5820
diff changeset
1632 ngx_resolver_free_node(r, rn);
7420068c4d4b Resolver: fixed use-after-free memory access.
Ruslan Ermilov <ru@nginx.com>
parents: 5820
diff changeset
1633
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1634 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1635 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1636
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1637 i = ans;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1638 naddrs = 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1639 cname = NULL;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1640
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1641 for (a = 0; a < nan; a++) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1642
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1643 start = i;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1644
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1645 while (i < last) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1646
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1647 if (buf[i] & 0xc0) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1648 i += 2;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1649 goto found;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1650 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1651
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1652 if (buf[i] == 0) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1653 i++;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1654 goto test_length;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1655 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1656
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1657 i += 1 + buf[i];
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1658 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1659
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1660 goto short_response;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1661
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1662 test_length:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1663
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1664 if (i - start < 2) {
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1665 err = "invalid name in DNS response";
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1666 goto invalid;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1667 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1668
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1669 found:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1670
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1671 if (i + sizeof(ngx_resolver_an_t) >= last) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1672 goto short_response;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1673 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1674
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1675 an = (ngx_resolver_an_t *) &buf[i];
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1676
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1677 type = (an->type_hi << 8) + an->type_lo;
5471
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
1678 class = (an->class_hi << 8) + an->class_lo;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1679 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
1680 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
1681 + (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
1682
5471
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
1683 if (class != 1) {
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
1684 ngx_log_error(r->log_level, r->log, 0,
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
1685 "unexpected RR class %ui", class);
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
1686 goto failed;
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
1687 }
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
1688
4295
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
1689 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
1690 ttl = 0;
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
1691 }
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1692
5485
8958656a8060 Resolver: use minimum TTL for caching (ticket #329).
Ruslan Ermilov <ru@nginx.com>
parents: 5479
diff changeset
1693 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
1694
5471
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
1695 i += sizeof(ngx_resolver_an_t);
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
1696
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1697 switch (type) {
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1698
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1699 case NGX_RESOLVE_A:
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1700
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1701 if (qtype != NGX_RESOLVE_A) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1702 err = "unexpected A record in DNS response";
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1703 goto invalid;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1704 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1705
5471
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
1706 if (len != 4) {
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
1707 err = "invalid A record in DNS response";
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
1708 goto invalid;
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
1709 }
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
1710
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
1711 if (i + 4 > last) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1712 goto short_response;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1713 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1714
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1715 naddrs++;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1716
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1717 break;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1718
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1719 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1720 case NGX_RESOLVE_AAAA:
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1721
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1722 if (qtype != NGX_RESOLVE_AAAA) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1723 err = "unexpected AAAA record in DNS response";
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1724 goto invalid;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1725 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1726
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1727 if (len != 16) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1728 err = "invalid AAAA record in DNS response";
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1729 goto invalid;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1730 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1731
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1732 if (i + 16 > last) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1733 goto short_response;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1734 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1735
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1736 naddrs++;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1737
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1738 break;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1739 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1740
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1741 case NGX_RESOLVE_CNAME:
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1742
5471
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
1743 cname = &buf[i];
1965
14463ae77723 take into account DNAME
Igor Sysoev <igor@sysoev.ru>
parents: 1961
diff changeset
1744
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1745 break;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1746
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1747 case NGX_RESOLVE_DNAME:
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1748
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1749 break;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1750
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1751 default:
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1752
1966
fb02f63eafd6 log unexpected qtype
Igor Sysoev <igor@sysoev.ru>
parents: 1965
diff changeset
1753 ngx_log_error(r->log_level, r->log, 0,
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1754 "unexpected RR type %ui", type);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1755 }
5471
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
1756
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
1757 i += len;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1758 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1759
4295
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
1760 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
1761 "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
1762 naddrs, cname, rn->ttl);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1763
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1764 if (naddrs) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1765
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1766 switch (qtype) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1767
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1768 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1769 case NGX_RESOLVE_AAAA:
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1770
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1771 if (naddrs == 1) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1772 addr6 = &rn->u6.addr6;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1773 rn->naddrs6 = 1;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1774
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1775 } else {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1776 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
1777 if (addr6 == NULL) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1778 goto failed;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1779 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1780
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1781 rn->u6.addrs6 = addr6;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1782 rn->naddrs6 = (u_short) naddrs;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1783 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1784
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1785 #if (NGX_SUPPRESS_WARN)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1786 addr = NULL;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1787 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1788
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1789 break;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1790 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1791
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1792 default: /* NGX_RESOLVE_A */
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1793
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1794 if (naddrs == 1) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1795 addr = &rn->u.addr;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1796 rn->naddrs = 1;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1797
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1798 } else {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1799 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
1800 if (addr == NULL) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1801 goto failed;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1802 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1803
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1804 rn->u.addrs = addr;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1805 rn->naddrs = (u_short) naddrs;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1806 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1807
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1808 #if (NGX_HAVE_INET6 && NGX_SUPPRESS_WARN)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1809 addr6 = NULL;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1810 #endif
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1811 }
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1812
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1813 n = 0;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1814 i = ans;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1815
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1816 for (a = 0; a < nan; a++) {
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1817
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1818 for ( ;; ) {
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1819
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1820 if (buf[i] & 0xc0) {
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1821 i += 2;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1822 break;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1823 }
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1824
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1825 if (buf[i] == 0) {
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1826 i++;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1827 break;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1828 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1829
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1830 i += 1 + buf[i];
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1831 }
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1832
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1833 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
1834
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1835 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
1836 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
1837
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1838 i += sizeof(ngx_resolver_an_t);
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1839
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1840 if (type == NGX_RESOLVE_A) {
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1841
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1842 addr[n] = htonl((buf[i] << 24) + (buf[i + 1] << 16)
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1843 + (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
1844
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1845 if (++n == naddrs) {
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1846
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1847 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1848 if (rn->naddrs6 == (u_short) -1) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1849 goto next;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1850 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1851 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1852
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1853 break;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1854 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1855 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1856
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1857 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1858 else if (type == NGX_RESOLVE_AAAA) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1859
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1860 ngx_memcpy(addr6[n].s6_addr, &buf[i], 16);
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1861
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1862 if (++n == naddrs) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1863
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1864 if (rn->naddrs == (u_short) -1) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1865 goto next;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1866 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1867
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1868 break;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1869 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1870 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1871 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1872
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1873 i += len;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1874 }
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1875 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1876
5768
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
1877 switch (qtype) {
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
1878
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
1879 #if (NGX_HAVE_INET6)
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
1880 case NGX_RESOLVE_AAAA:
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
1881
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
1882 if (rn->naddrs6 == (u_short) -1) {
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
1883 rn->naddrs6 = 0;
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
1884 }
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
1885
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
1886 break;
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
1887 #endif
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
1888
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
1889 default: /* NGX_RESOLVE_A */
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
1890
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
1891 if (rn->naddrs == (u_short) -1) {
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
1892 rn->naddrs = 0;
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
1893 }
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
1894 }
70a0408cca7b Resolver: fixed resend on malformed responses.
Ruslan Ermilov <ru@nginx.com>
parents: 5764
diff changeset
1895
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1896 if (rn->naddrs != (u_short) -1
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1897 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1898 && rn->naddrs6 != (u_short) -1
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1899 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1900 && rn->naddrs
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1901 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1902 + rn->naddrs6
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1903 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1904 > 0)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1905 {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1906
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1907 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1908 export:
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1909 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1910
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1911 naddrs = rn->naddrs;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1912 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1913 naddrs += rn->naddrs6;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1914 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1915
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1916 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
1917 addrs = NULL;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1918
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1919 } else {
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1920 addrs = ngx_resolver_export(r, rn, 0);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1921 if (addrs == NULL) {
5471
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
1922 goto failed;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1923 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1924 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1925
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1926 ngx_queue_remove(&rn->queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1927
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1928 rn->valid = ngx_time() + (r->valid ? r->valid : (time_t) rn->ttl);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1929 rn->expire = ngx_time() + r->expire;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1930
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1931 ngx_queue_insert_head(&r->name_expire_queue, &rn->queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1932
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1933 next = rn->waiting;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1934 rn->waiting = NULL;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1935
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1936 /* unlock name mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1937
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1938 while (next) {
5474
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
1939 ctx = next;
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
1940 ctx->state = NGX_OK;
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
1941 ctx->naddrs = naddrs;
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1942
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1943 if (addrs == NULL) {
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1944 ctx->addrs = &ctx->addr;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1945 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
1946 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
1947 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
1948 ctx->sin.sin_family = AF_INET;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1949 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
1950
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1951 } else {
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1952 ctx->addrs = addrs;
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1953 }
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1954
5474
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
1955 next = ctx->next;
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
1956
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
1957 ctx->handler(ctx);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1958 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1959
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1960 if (addrs != NULL) {
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
1961 ngx_resolver_free(r, addrs->sockaddr);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1962 ngx_resolver_free(r, addrs);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1963 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1964
4619
3171ec7d0d05 Resolver: protection from duplicate responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4610
diff changeset
1965 ngx_resolver_free(r, rn->query);
3171ec7d0d05 Resolver: protection from duplicate responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4610
diff changeset
1966 rn->query = NULL;
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1967 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1968 rn->query6 = NULL;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1969 #endif
4619
3171ec7d0d05 Resolver: protection from duplicate responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4610
diff changeset
1970
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1971 return;
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1972 }
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1973
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1974 if (cname) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1975
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1976 /* CNAME only */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1977
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1978 if (rn->naddrs == (u_short) -1
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1979 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1980 || rn->naddrs6 == (u_short) -1
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1981 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1982 )
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1983 {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1984 goto next;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1985 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
1986
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
1987 if (ngx_resolver_copy(r, &name, buf, cname, buf + last) != NGX_OK) {
5471
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
1988 goto failed;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1989 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1990
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1991 ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0,
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1992 "resolver cname:\"%V\"", &name);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1993
1741
0829024c924d fix segfault if response will have CNAME only
Igor Sysoev <igor@sysoev.ru>
parents: 1689
diff changeset
1994 ngx_queue_remove(&rn->queue);
0829024c924d fix segfault if response will have CNAME only
Igor Sysoev <igor@sysoev.ru>
parents: 1689
diff changeset
1995
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1996 rn->cnlen = (u_short) name.len;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
1997 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
1998
5485
8958656a8060 Resolver: use minimum TTL for caching (ticket #329).
Ruslan Ermilov <ru@nginx.com>
parents: 5479
diff changeset
1999 rn->valid = ngx_time() + (r->valid ? r->valid : (time_t) rn->ttl);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2000 rn->expire = ngx_time() + r->expire;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2001
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2002 ngx_queue_insert_head(&r->name_expire_queue, &rn->queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2003
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2004 ctx = rn->waiting;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2005 rn->waiting = NULL;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2006
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2007 if (ctx) {
6351
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
2008
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
2009 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
2010 next->node = NULL;
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
2011 }
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
2012
497d0cff8ace Resolver: fixed use-after-free memory accesses with CNAME.
Roman Arutyunyan <arut@nginx.com>
parents: 6350
diff changeset
2013 (void) ngx_resolve_name_locked(r, ctx, &name);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2014 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2015
4619
3171ec7d0d05 Resolver: protection from duplicate responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4610
diff changeset
2016 ngx_resolver_free(r, rn->query);
3171ec7d0d05 Resolver: protection from duplicate responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4610
diff changeset
2017 rn->query = NULL;
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2018 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2019 rn->query6 = NULL;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2020 #endif
4619
3171ec7d0d05 Resolver: protection from duplicate responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4610
diff changeset
2021
5471
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
2022 /* unlock name mutex */
9c96782d9d05 Resolver: fixes in A processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5470
diff changeset
2023
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2024 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2025 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2026
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2027 ngx_log_error(r->log_level, r->log, 0,
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2028 "no A or CNAME types in DNS response");
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2029 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2030
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2031 short_response:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2032
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2033 err = "short DNS response";
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2034
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2035 invalid:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2036
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2037 /* unlock name mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2038
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2039 ngx_log_error(r->log_level, r->log, 0, err);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2040
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2041 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2042
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2043 failed:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2044
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2045 next:
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2046
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2047 /* unlock name mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2048
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2049 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2050 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2051
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2052
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2053 static void
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2054 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
2055 ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan)
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2056 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2057 char *err;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2058 size_t len;
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2059 u_char text[NGX_SOCKADDR_STRLEN];
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2060 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
2061 int32_t ttl;
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2062 ngx_int_t octet;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2063 ngx_str_t name;
5472
ab493c60d9ff Resolver: fixes in PTR processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5471
diff changeset
2064 ngx_uint_t i, mask, qident, class;
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2065 ngx_queue_t *expire_queue;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2066 ngx_rbtree_t *tree;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2067 ngx_resolver_an_t *an;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2068 ngx_resolver_ctx_t *ctx, *next;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2069 ngx_resolver_node_t *rn;
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2070 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2071 uint32_t hash;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2072 ngx_int_t digit;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2073 struct in6_addr addr6;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2074 #endif
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2075
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2076 if (ngx_resolver_copy(r, NULL, buf,
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2077 buf + sizeof(ngx_resolver_hdr_t), buf + n)
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2078 != NGX_OK)
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2079 {
5472
ab493c60d9ff Resolver: fixes in PTR processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5471
diff changeset
2080 return;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2081 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2082
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2083 /* AF_INET */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2084
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2085 addr = 0;
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2086 i = sizeof(ngx_resolver_hdr_t);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2087
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2088 for (mask = 0; mask < 32; mask += 8) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2089 len = buf[i++];
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2090
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2091 octet = ngx_atoi(&buf[i], len);
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2092 if (octet == NGX_ERROR || octet > 255) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2093 goto invalid_in_addr_arpa;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2094 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2095
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2096 addr += octet << mask;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2097 i += len;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2098 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2099
5479
c0d6eae5a1c5 Resolver: lookups are case-insensitive.
Ruslan Ermilov <ru@nginx.com>
parents: 5478
diff changeset
2100 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
2101 i += sizeof("\7in-addr\4arpa");
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2102
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2103 /* lock addr mutex */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2104
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2105 rn = ngx_resolver_lookup_addr(r, addr);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2106
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2107 tree = &r->addr_rbtree;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2108 expire_queue = &r->addr_expire_queue;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2109
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2110 addr = htonl(addr);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2111 name.len = ngx_inet_ntop(AF_INET, &addr, text, NGX_SOCKADDR_STRLEN);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2112 name.data = text;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2113
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2114 goto valid;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2115 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2116
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2117 invalid_in_addr_arpa:
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2118
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2119 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2120
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2121 i = sizeof(ngx_resolver_hdr_t);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2122
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2123 for (octet = 15; octet >= 0; octet--) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2124 if (buf[i++] != '\1') {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2125 goto invalid_ip6_arpa;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2126 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2127
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2128 digit = ngx_hextoi(&buf[i++], 1);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2129 if (digit == NGX_ERROR) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2130 goto invalid_ip6_arpa;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2131 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2132
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2133 addr6.s6_addr[octet] = (u_char) digit;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2134
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2135 if (buf[i++] != '\1') {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2136 goto invalid_ip6_arpa;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2137 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2138
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2139 digit = ngx_hextoi(&buf[i++], 1);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2140 if (digit == NGX_ERROR) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2141 goto invalid_ip6_arpa;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2142 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2143
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2144 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
2145 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2146
5479
c0d6eae5a1c5 Resolver: lookups are case-insensitive.
Ruslan Ermilov <ru@nginx.com>
parents: 5478
diff changeset
2147 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
2148 i += sizeof("\3ip6\4arpa");
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2149
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2150 /* lock addr mutex */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2151
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2152 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
2153 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
2154
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2155 tree = &r->addr6_rbtree;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2156 expire_queue = &r->addr6_expire_queue;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2157
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2158 name.len = ngx_inet6_ntop(addr6.s6_addr, text, NGX_SOCKADDR_STRLEN);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2159 name.data = text;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2160
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2161 goto valid;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2162 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2163
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2164 invalid_ip6_arpa:
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2165 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2166
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2167 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
2168 "invalid in-addr.arpa or ip6.arpa name in DNS response");
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2169 return;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2170
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2171 valid:
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2172
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2173 if (rn == NULL || rn->query == NULL) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2174 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
2175 "unexpected response for %V", &name);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2176 goto failed;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2177 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2178
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2179 qident = (rn->query[0] << 8) + rn->query[1];
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2180
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2181 if (ident != qident) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2182 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
2183 "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
2184 ident, &name, qident);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2185 goto failed;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2186 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2187
1742
268b81386fe4 no answers in DNS response should be NXDOMAIN
Igor Sysoev <igor@sysoev.ru>
parents: 1741
diff changeset
2188 if (code == 0 && nan == 0) {
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2189 code = NGX_RESOLVE_NXDOMAIN;
1742
268b81386fe4 no answers in DNS response should be NXDOMAIN
Igor Sysoev <igor@sysoev.ru>
parents: 1741
diff changeset
2190 }
268b81386fe4 no answers in DNS response should be NXDOMAIN
Igor Sysoev <igor@sysoev.ru>
parents: 1741
diff changeset
2191
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2192 if (code) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2193 next = rn->waiting;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2194 rn->waiting = NULL;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2195
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2196 ngx_queue_remove(&rn->queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2197
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2198 ngx_rbtree_delete(tree, &rn->node);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2199
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2200 /* unlock addr mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2201
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2202 while (next) {
5474
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
2203 ctx = next;
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
2204 ctx->state = code;
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
2205 next = ctx->next;
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
2206
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
2207 ctx->handler(ctx);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2208 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2209
5920
7420068c4d4b Resolver: fixed use-after-free memory access.
Ruslan Ermilov <ru@nginx.com>
parents: 5820
diff changeset
2210 ngx_resolver_free_node(r, rn);
7420068c4d4b Resolver: fixed use-after-free memory access.
Ruslan Ermilov <ru@nginx.com>
parents: 5820
diff changeset
2211
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2212 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2213 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2214
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2215 i += sizeof(ngx_resolver_qs_t);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2216
5472
ab493c60d9ff Resolver: fixes in PTR processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5471
diff changeset
2217 if (i + 2 + sizeof(ngx_resolver_an_t) >= n) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2218 goto short_response;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2219 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2220
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2221 /* compression pointer to *.arpa */
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2222
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2223 if (buf[i] != 0xc0 || buf[i + 1] != sizeof(ngx_resolver_hdr_t)) {
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2224 err = "invalid in-addr.arpa or ip6.arpa name in DNS response";
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2225 goto invalid;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2226 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2227
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2228 an = (ngx_resolver_an_t *) &buf[i + 2];
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2229
5472
ab493c60d9ff Resolver: fixes in PTR processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5471
diff changeset
2230 class = (an->class_hi << 8) + an->class_lo;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2231 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
2232 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
2233 + (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
2234
5472
ab493c60d9ff Resolver: fixes in PTR processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5471
diff changeset
2235 if (class != 1) {
ab493c60d9ff Resolver: fixes in PTR processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5471
diff changeset
2236 ngx_log_error(r->log_level, r->log, 0,
ab493c60d9ff Resolver: fixes in PTR processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5471
diff changeset
2237 "unexpected RR class %ui", class);
ab493c60d9ff Resolver: fixes in PTR processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5471
diff changeset
2238 goto failed;
ab493c60d9ff Resolver: fixes in PTR processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5471
diff changeset
2239 }
ab493c60d9ff Resolver: fixes in PTR processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5471
diff changeset
2240
4295
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
2241 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
2242 ttl = 0;
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
2243 }
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2244
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2245 ngx_log_debug3(NGX_LOG_DEBUG_CORE, r->log, 0,
3902
159b58f9c0bd fix building by gcc 4.6 without --with-debug
Igor Sysoev <igor@sysoev.ru>
parents: 3763
diff changeset
2246 "resolver qt:%ui cl:%ui len:%uz",
159b58f9c0bd fix building by gcc 4.6 without --with-debug
Igor Sysoev <igor@sysoev.ru>
parents: 3763
diff changeset
2247 (an->type_hi << 8) + an->type_lo,
5472
ab493c60d9ff Resolver: fixes in PTR processing.
Ruslan Ermilov <ru@nginx.com>
parents: 5471
diff changeset
2248 class, len);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2249
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2250 i += 2 + sizeof(ngx_resolver_an_t);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2251
5469
b2fc466a11a7 Resolver: removed unnecessary casts.
Ruslan Ermilov <ru@nginx.com>
parents: 5468
diff changeset
2252 if (i + len > n) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2253 goto short_response;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2254 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2255
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2256 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
2257 goto failed;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2258 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2259
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2260 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
2261
2486
8de5dc3e7001 use length of uncompressed name
Igor Sysoev <igor@sysoev.ru>
parents: 2484
diff changeset
2262 if (name.len != (size_t) rn->nlen
8de5dc3e7001 use length of uncompressed name
Igor Sysoev <igor@sysoev.ru>
parents: 2484
diff changeset
2263 || ngx_strncmp(name.data, rn->name, name.len) != 0)
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2264 {
2482
30ec8c5ac75b fix reverse resolving cache: it stored zero length names
Igor Sysoev <igor@sysoev.ru>
parents: 2314
diff changeset
2265 if (rn->nlen) {
30ec8c5ac75b fix reverse resolving cache: it stored zero length names
Igor Sysoev <igor@sysoev.ru>
parents: 2314
diff changeset
2266 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
2267 }
30ec8c5ac75b fix reverse resolving cache: it stored zero length names
Igor Sysoev <igor@sysoev.ru>
parents: 2314
diff changeset
2268
2490
1c87647b7ca5 fix building by msvc, introduced in r2487
Igor Sysoev <igor@sysoev.ru>
parents: 2487
diff changeset
2269 rn->nlen = (u_short) name.len;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2270 rn->name = name.data;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2271
2486
8de5dc3e7001 use length of uncompressed name
Igor Sysoev <igor@sysoev.ru>
parents: 2484
diff changeset
2272 name.data = ngx_resolver_dup(r, rn->name, name.len);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2273 if (name.data == NULL) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2274 goto failed;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2275 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2276 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2277
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2278 ngx_queue_remove(&rn->queue);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2279
4295
05031fce7ce8 Now nginx uses TTL of a DNS response when calculating cache validity.
Ruslan Ermilov <ru@nginx.com>
parents: 4267
diff changeset
2280 rn->valid = ngx_time() + (r->valid ? r->valid : ttl);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2281 rn->expire = ngx_time() + r->expire;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2282
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2283 ngx_queue_insert_head(expire_queue, &rn->queue);
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 next = rn->waiting;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2286 rn->waiting = NULL;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2287
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2288 /* unlock addr mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2289
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2290 while (next) {
5474
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
2291 ctx = next;
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
2292 ctx->state = NGX_OK;
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
2293 ctx->name = name;
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
2294 next = ctx->next;
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
2295
b43b02bb54db Resolver: fixed indentation.
Ruslan Ermilov <ru@nginx.com>
parents: 5472
diff changeset
2296 ctx->handler(ctx);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2297 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2298
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2299 ngx_resolver_free(r, name.data);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2300
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2301 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2302
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2303 short_response:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2304
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2305 err = "short DNS response";
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2306
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2307 invalid:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2308
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2309 /* unlock addr mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2310
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2311 ngx_log_error(r->log_level, r->log, 0, err);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2312
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2313 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2314
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2315 failed:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2316
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2317 /* unlock addr mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2318
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2319 return;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2320 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2321
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2322
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2323 static ngx_resolver_node_t *
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2324 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
2325 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2326 ngx_int_t rc;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2327 ngx_rbtree_node_t *node, *sentinel;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2328 ngx_resolver_node_t *rn;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2329
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2330 node = r->name_rbtree.root;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2331 sentinel = r->name_rbtree.sentinel;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2332
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2333 while (node != sentinel) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2334
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2335 if (hash < node->key) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2336 node = node->left;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2337 continue;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2338 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2339
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2340 if (hash > node->key) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2341 node = node->right;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2342 continue;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2343 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2344
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2345 /* hash == node->key */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2346
5921
5004210e8c78 Resolver: fixed debug event logging.
Ruslan Ermilov <ru@nginx.com>
parents: 5920
diff changeset
2347 rn = ngx_resolver_node(node);
4497
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4496
diff changeset
2348
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4496
diff changeset
2349 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
2350
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4496
diff changeset
2351 if (rc == 0) {
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4496
diff changeset
2352 return rn;
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4496
diff changeset
2353 }
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4496
diff changeset
2354
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4496
diff changeset
2355 node = (rc < 0) ? node->left : node->right;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2356 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2357
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2358 /* not found */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2359
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2360 return NULL;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2361 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2362
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2363
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2364 static ngx_resolver_node_t *
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2365 ngx_resolver_lookup_addr(ngx_resolver_t *r, in_addr_t addr)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2366 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2367 ngx_rbtree_node_t *node, *sentinel;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2368
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2369 node = r->addr_rbtree.root;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2370 sentinel = r->addr_rbtree.sentinel;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2371
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2372 while (node != sentinel) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2373
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2374 if (addr < node->key) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2375 node = node->left;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2376 continue;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2377 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2378
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2379 if (addr > node->key) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2380 node = node->right;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2381 continue;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2382 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2383
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2384 /* addr == node->key */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2385
5921
5004210e8c78 Resolver: fixed debug event logging.
Ruslan Ermilov <ru@nginx.com>
parents: 5920
diff changeset
2386 return ngx_resolver_node(node);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2387 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2388
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2389 /* not found */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2390
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2391 return NULL;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2392 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2393
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2394
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2395 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2396
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2397 static ngx_resolver_node_t *
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2398 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
2399 uint32_t hash)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2400 {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2401 ngx_int_t rc;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2402 ngx_rbtree_node_t *node, *sentinel;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2403 ngx_resolver_node_t *rn;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2404
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2405 node = r->addr6_rbtree.root;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2406 sentinel = r->addr6_rbtree.sentinel;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2407
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2408 while (node != sentinel) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2409
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2410 if (hash < node->key) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2411 node = node->left;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2412 continue;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2413 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2414
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2415 if (hash > node->key) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2416 node = node->right;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2417 continue;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2418 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2419
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2420 /* hash == node->key */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2421
5921
5004210e8c78 Resolver: fixed debug event logging.
Ruslan Ermilov <ru@nginx.com>
parents: 5920
diff changeset
2422 rn = ngx_resolver_node(node);
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2423
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2424 rc = ngx_memcmp(addr, &rn->addr6, 16);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2425
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2426 if (rc == 0) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2427 return rn;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2428 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2429
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2430 node = (rc < 0) ? node->left : node->right;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2431 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2432
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2433 /* not found */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2434
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2435 return NULL;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2436 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2437
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2438 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2439
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2440
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2441 static void
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2442 ngx_resolver_rbtree_insert_value(ngx_rbtree_node_t *temp,
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2443 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2444 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2445 ngx_rbtree_node_t **p;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2446 ngx_resolver_node_t *rn, *rn_temp;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2447
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2448 for ( ;; ) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2449
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2450 if (node->key < temp->key) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2451
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2452 p = &temp->left;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2453
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2454 } else if (node->key > temp->key) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2455
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2456 p = &temp->right;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2457
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2458 } else { /* node->key == temp->key */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2459
5921
5004210e8c78 Resolver: fixed debug event logging.
Ruslan Ermilov <ru@nginx.com>
parents: 5920
diff changeset
2460 rn = ngx_resolver_node(node);
5004210e8c78 Resolver: fixed debug event logging.
Ruslan Ermilov <ru@nginx.com>
parents: 5920
diff changeset
2461 rn_temp = ngx_resolver_node(temp);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2462
3143
ab6258e18099 fix resolver cache rbtree comparison
Igor Sysoev <igor@sysoev.ru>
parents: 3139
diff changeset
2463 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
2464 < 0) ? &temp->left : &temp->right;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2465 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2466
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2467 if (*p == sentinel) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2468 break;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2469 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2470
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2471 temp = *p;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2472 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2473
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2474 *p = node;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2475 node->parent = temp;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2476 node->left = sentinel;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2477 node->right = sentinel;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2478 ngx_rbt_red(node);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2479 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2480
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2481
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2482 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2483
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2484 static void
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2485 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
2486 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
2487 {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2488 ngx_rbtree_node_t **p;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2489 ngx_resolver_node_t *rn, *rn_temp;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2490
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2491 for ( ;; ) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2492
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2493 if (node->key < temp->key) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2494
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2495 p = &temp->left;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2496
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2497 } else if (node->key > temp->key) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2498
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2499 p = &temp->right;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2500
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2501 } else { /* node->key == temp->key */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2502
5921
5004210e8c78 Resolver: fixed debug event logging.
Ruslan Ermilov <ru@nginx.com>
parents: 5920
diff changeset
2503 rn = ngx_resolver_node(node);
5004210e8c78 Resolver: fixed debug event logging.
Ruslan Ermilov <ru@nginx.com>
parents: 5920
diff changeset
2504 rn_temp = ngx_resolver_node(temp);
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2505
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2506 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
2507 < 0) ? &temp->left : &temp->right;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2508 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2509
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2510 if (*p == sentinel) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2511 break;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2512 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2513
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2514 temp = *p;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2515 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2516
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2517 *p = node;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2518 node->parent = temp;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2519 node->left = sentinel;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2520 node->right = sentinel;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2521 ngx_rbt_red(node);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2522 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2523
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2524 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2525
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2526
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2527 static ngx_int_t
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
2528 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
2529 ngx_str_t *name)
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2530 {
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2531 u_char *p, *s;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2532 size_t len, nlen;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2533 ngx_uint_t ident;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2534 ngx_resolver_qs_t *qs;
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2535 ngx_resolver_hdr_t *query;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2536
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
2537 nlen = name->len ? (1 + name->len + 1) : 1;
3306
61bdaac6c668 fix resolving an empty name (".")
Igor Sysoev <igor@sysoev.ru>
parents: 3299
diff changeset
2538
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2539 len = sizeof(ngx_resolver_hdr_t) + nlen + sizeof(ngx_resolver_qs_t);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2540
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2541 #if (NGX_HAVE_INET6)
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
2542 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
2543 #else
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
2544 p = ngx_resolver_alloc(r, len);
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2545 #endif
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2546 if (p == NULL) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2547 return NGX_ERROR;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2548 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2549
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2550 rn->qlen = (u_short) len;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2551 rn->query = p;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2552
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2553 #if (NGX_HAVE_INET6)
5478
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
2554 if (r->ipv6) {
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
2555 rn->query6 = p + len;
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
2556 }
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2557 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2558
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2559 query = (ngx_resolver_hdr_t *) p;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2560
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2561 ident = ngx_random();
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2562
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
2563 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
2564 "resolve: \"%V\" A %i", name, ident & 0xffff);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2565
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2566 query->ident_hi = (u_char) ((ident >> 8) & 0xff);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2567 query->ident_lo = (u_char) (ident & 0xff);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2568
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2569 /* recursion query */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2570 query->flags_hi = 1; query->flags_lo = 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2571
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2572 /* one question */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2573 query->nqs_hi = 0; query->nqs_lo = 1;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2574 query->nan_hi = 0; query->nan_lo = 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2575 query->nns_hi = 0; query->nns_lo = 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2576 query->nar_hi = 0; query->nar_lo = 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2577
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2578 p += sizeof(ngx_resolver_hdr_t) + nlen;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2579
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2580 qs = (ngx_resolver_qs_t *) p;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2581
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2582 /* query type */
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2583 qs->type_hi = 0; qs->type_lo = NGX_RESOLVE_A;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2584
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2585 /* IN query class */
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2586 qs->class_hi = 0; qs->class_lo = 1;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2587
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2588 /* convert "www.example.com" to "\3www\7example\3com\0" */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2589
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2590 len = 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2591 p--;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2592 *p-- = '\0';
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2593
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
2594 if (name->len == 0) {
4610
778d2cc03e22 Fixed segmentation fault in ngx_resolver_create_name_query().
Ruslan Ermilov <ru@nginx.com>
parents: 4556
diff changeset
2595 return NGX_DECLINED;
778d2cc03e22 Fixed segmentation fault in ngx_resolver_create_name_query().
Ruslan Ermilov <ru@nginx.com>
parents: 4556
diff changeset
2596 }
778d2cc03e22 Fixed segmentation fault in ngx_resolver_create_name_query().
Ruslan Ermilov <ru@nginx.com>
parents: 4556
diff changeset
2597
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
2598 for (s = name->data + name->len - 1; s >= name->data; s--) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2599 if (*s != '.') {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2600 *p = *s;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2601 len++;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2602
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2603 } else {
4556
1bddc91e78d6 Resolver: added missing sanity checking when creating name queries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4497
diff changeset
2604 if (len == 0 || len > 255) {
1961
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
2605 return NGX_DECLINED;
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
2606 }
99b9feacccb4 return NXDOMAIN for ".." in host name
Igor Sysoev <igor@sysoev.ru>
parents: 1960
diff changeset
2607
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2608 *p = (u_char) len;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2609 len = 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2610 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2611
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2612 p--;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2613 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2614
4556
1bddc91e78d6 Resolver: added missing sanity checking when creating name queries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4497
diff changeset
2615 if (len == 0 || len > 255) {
1bddc91e78d6 Resolver: added missing sanity checking when creating name queries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4497
diff changeset
2616 return NGX_DECLINED;
1bddc91e78d6 Resolver: added missing sanity checking when creating name queries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4497
diff changeset
2617 }
1bddc91e78d6 Resolver: added missing sanity checking when creating name queries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4497
diff changeset
2618
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2619 *p = (u_char) len;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2620
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2621 #if (NGX_HAVE_INET6)
5478
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
2622 if (!r->ipv6) {
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
2623 return NGX_OK;
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
2624 }
3cb3175a6fef The "ipv6=" boolean parameter of the "resolver" directive.
Ruslan Ermilov <ru@nginx.com>
parents: 5477
diff changeset
2625
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2626 p = rn->query6;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2627
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2628 ngx_memcpy(p, rn->query, rn->qlen);
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2629
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2630 query = (ngx_resolver_hdr_t *) p;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2631
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2632 ident = ngx_random();
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2633
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
2634 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
2635 "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
2636
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2637 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
2638 query->ident_lo = (u_char) (ident & 0xff);
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2639
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2640 p += sizeof(ngx_resolver_hdr_t) + nlen;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2641
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2642 qs = (ngx_resolver_qs_t *) p;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2643
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2644 qs->type_lo = NGX_RESOLVE_AAAA;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2645 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2646
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2647 return NGX_OK;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2648 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2650
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2651 static ngx_int_t
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
2652 ngx_resolver_create_addr_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
2653 ngx_addr_t *addr)
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2654 {
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2655 u_char *p, *d;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2656 size_t len;
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
2657 in_addr_t inaddr;
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2658 ngx_int_t n;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2659 ngx_uint_t ident;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2660 ngx_resolver_hdr_t *query;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2661 struct sockaddr_in *sin;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2662 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2663 struct sockaddr_in6 *sin6;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2664 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2665
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
2666 switch (addr->sockaddr->sa_family) {
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2667
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2668 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2669 case AF_INET6:
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2670 len = sizeof(ngx_resolver_hdr_t)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2671 + 64 + sizeof(".ip6.arpa.") - 1
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2672 + sizeof(ngx_resolver_qs_t);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2673
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2674 break;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2675 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2676
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2677 default: /* AF_INET */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2678 len = sizeof(ngx_resolver_hdr_t)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2679 + 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
2680 + sizeof(ngx_resolver_qs_t);
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2681 }
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2682
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
2683 p = ngx_resolver_alloc(r, len);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2684 if (p == NULL) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2685 return NGX_ERROR;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2686 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2687
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2688 rn->query = p;
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2689 query = (ngx_resolver_hdr_t *) p;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2690
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2691 ident = ngx_random();
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2692
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2693 query->ident_hi = (u_char) ((ident >> 8) & 0xff);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2694 query->ident_lo = (u_char) (ident & 0xff);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2695
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2696 /* recursion query */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2697 query->flags_hi = 1; query->flags_lo = 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2698
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2699 /* one question */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2700 query->nqs_hi = 0; query->nqs_lo = 1;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2701 query->nan_hi = 0; query->nan_lo = 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2702 query->nns_hi = 0; query->nns_lo = 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2703 query->nar_hi = 0; query->nar_lo = 0;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2704
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2705 p += sizeof(ngx_resolver_hdr_t);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2706
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
2707 switch (addr->sockaddr->sa_family) {
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2708
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2709 #if (NGX_HAVE_INET6)
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2710 case AF_INET6:
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
2711 sin6 = (struct sockaddr_in6 *) addr->sockaddr;
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2712
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2713 for (n = 15; n >= 0; n--) {
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2714 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
2715 sin6->sin6_addr.s6_addr[n] & 0xf,
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2716 (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
2717 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2718
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2719 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
2720
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2721 break;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2722 #endif
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2723
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2724 default: /* AF_INET */
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2725
6350
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
2726 sin = (struct sockaddr_in *) addr->sockaddr;
a5767988c022 Resolver: changed the ngx_resolver_create_*_query() arguments.
Roman Arutyunyan <arut@nginx.com>
parents: 6349
diff changeset
2727 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
2728
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2729 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
2730 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
2731 *p = (u_char) (d - &p[1]);
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2732 p = d;
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2733 }
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2734
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2735 p = ngx_cpymem(p, "\7in-addr\4arpa\0", 14);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2736 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2737
5468
5c410d6ca7dd Resolver: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
2738 /* query type "PTR", IN query class */
5476
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2739 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
2740
950c9ed3e66f Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5475
diff changeset
2741 rn->qlen = (u_short) (p - rn->query);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2742
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2743 return NGX_OK;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2744 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2745
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2746
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2747 static ngx_int_t
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2748 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
2749 u_char *last)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2750 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2751 char *err;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2752 u_char *p, *dst;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2753 ssize_t len;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2754 ngx_uint_t i, n;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2755
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2756 p = src;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2757 len = -1;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2758
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2759 /*
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2760 * compression pointers allow to create endless loop, so we set limit;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2761 * 128 pointers should be enough to store 255-byte name
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2762 */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2763
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2764 for (i = 0; i < 128; i++) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2765 n = *p++;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2766
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2767 if (n == 0) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2768 goto done;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2769 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2770
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2771 if (n & 0xc0) {
2314
52987a023486 fix compression pointer for big (>255) DNS responses
Igor Sysoev <igor@sysoev.ru>
parents: 2282
diff changeset
2772 n = ((n & 0x3f) << 8) + *p;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2773 p = &buf[n];
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2774
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2775 } else {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2776 len += 1 + n;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2777 p = &p[n];
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2778 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2779
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2780 if (p >= last) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2781 err = "name is out of response";
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2782 goto invalid;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2783 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2784 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2785
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2786 err = "compression pointers loop";
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2787
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2788 invalid:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2789
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2790 ngx_log_error(r->log_level, r->log, 0, err);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2791
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2792 return NGX_ERROR;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2793
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2794 done:
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2795
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2796 if (name == NULL) {
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2797 return NGX_OK;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2798 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2799
3298
847ab5a32307 fix "PTR ." case in address resolver
Igor Sysoev <igor@sysoev.ru>
parents: 3297
diff changeset
2800 if (len == -1) {
5764
f166c521b619 Style: use ngx_str_null().
Tatsuhiko Kubo <cubicdaiya@gmail.com>
parents: 5600
diff changeset
2801 ngx_str_null(name);
3298
847ab5a32307 fix "PTR ." case in address resolver
Igor Sysoev <igor@sysoev.ru>
parents: 3297
diff changeset
2802 return NGX_OK;
847ab5a32307 fix "PTR ." case in address resolver
Igor Sysoev <igor@sysoev.ru>
parents: 3297
diff changeset
2803 }
847ab5a32307 fix "PTR ." case in address resolver
Igor Sysoev <igor@sysoev.ru>
parents: 3297
diff changeset
2804
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2805 dst = ngx_resolver_alloc(r, len);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2806 if (dst == NULL) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2807 return NGX_ERROR;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2808 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2809
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2810 name->data = dst;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2811
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2812 n = *src++;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2813
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2814 for ( ;; ) {
4267
768212ca0745 Fixed compression pointer processing in DNS response greater than 255 bytes.
Igor Sysoev <igor@sysoev.ru>
parents: 4225
diff changeset
2815 if (n & 0xc0) {
768212ca0745 Fixed compression pointer processing in DNS response greater than 255 bytes.
Igor Sysoev <igor@sysoev.ru>
parents: 4225
diff changeset
2816 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
2817 src = &buf[n];
768212ca0745 Fixed compression pointer processing in DNS response greater than 255 bytes.
Igor Sysoev <igor@sysoev.ru>
parents: 4225
diff changeset
2818
768212ca0745 Fixed compression pointer processing in DNS response greater than 255 bytes.
Igor Sysoev <igor@sysoev.ru>
parents: 4225
diff changeset
2819 n = *src++;
768212ca0745 Fixed compression pointer processing in DNS response greater than 255 bytes.
Igor Sysoev <igor@sysoev.ru>
parents: 4225
diff changeset
2820
768212ca0745 Fixed compression pointer processing in DNS response greater than 255 bytes.
Igor Sysoev <igor@sysoev.ru>
parents: 4225
diff changeset
2821 } else {
5479
c0d6eae5a1c5 Resolver: lookups are case-insensitive.
Ruslan Ermilov <ru@nginx.com>
parents: 5478
diff changeset
2822 ngx_strlow(dst, src, n);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2823 dst += n;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2824 src += n;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2825
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2826 n = *src++;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2827
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2828 if (n != 0) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2829 *dst++ = '.';
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2830 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2831 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2832
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2833 if (n == 0) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2834 name->len = dst - name->data;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2835 return NGX_OK;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2836 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2837 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2838 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2839
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2840
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2841 static void
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2842 ngx_resolver_timeout_handler(ngx_event_t *ev)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2843 {
6348
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
2844 ngx_resolver_ctx_t *ctx;
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
2845
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
2846 ctx = ev->data;
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
2847
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
2848 ctx->state = NGX_RESOLVE_TIMEDOUT;
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
2849
7316c57e4fe7 Resolver: fixed crashes in timeout handler.
Ruslan Ermilov <ru@nginx.com>
parents: 6347
diff changeset
2850 ctx->handler(ctx);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2851 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2852
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2853
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2854 static void
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2855 ngx_resolver_free_node(ngx_resolver_t *r, ngx_resolver_node_t *rn)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2856 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2857 /* lock alloc mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2858
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2859 if (rn->query) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2860 ngx_resolver_free_locked(r, rn->query);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2861 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2862
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2863 if (rn->name) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2864 ngx_resolver_free_locked(r, rn->name);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2865 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2866
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2867 if (rn->cnlen) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2868 ngx_resolver_free_locked(r, rn->u.cname);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2869 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2870
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2871 if (rn->naddrs > 1 && rn->naddrs != (u_short) -1) {
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2872 ngx_resolver_free_locked(r, rn->u.addrs);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2873 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2874
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2875 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2876 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
2877 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
2878 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2879 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2880
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2881 ngx_resolver_free_locked(r, rn);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2882
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2883 /* unlock alloc mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2884 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2885
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2886
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2887 static void *
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2888 ngx_resolver_alloc(ngx_resolver_t *r, size_t size)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2889 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2890 u_char *p;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2891
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2892 /* lock alloc mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2893
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2894 p = ngx_alloc(size, r->log);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2895
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2896 /* unlock alloc mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2897
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2898 return p;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2899 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2900
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2901
1903
1ea922585517 static ngx_resolver_calloc()
Igor Sysoev <igor@sysoev.ru>
parents: 1880
diff changeset
2902 static void *
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2903 ngx_resolver_calloc(ngx_resolver_t *r, size_t size)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2904 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2905 u_char *p;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2906
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2907 p = ngx_resolver_alloc(r, size);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2908
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2909 if (p) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2910 ngx_memzero(p, size);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2911 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2912
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2913 return p;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2914 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2915
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2916
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2917 static void
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2918 ngx_resolver_free(ngx_resolver_t *r, void *p)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2919 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2920 /* lock alloc mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2921
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2922 ngx_free(p);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2923
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2924 /* unlock alloc mutex */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2925 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2926
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2927
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2928 static void
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2929 ngx_resolver_free_locked(ngx_resolver_t *r, void *p)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2930 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2931 ngx_free(p);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2932 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2933
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2934
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2935 static void *
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2936 ngx_resolver_dup(ngx_resolver_t *r, void *src, size_t size)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2937 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2938 void *dst;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2939
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2940 dst = ngx_resolver_alloc(r, size);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2941
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2942 if (dst == NULL) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2943 return dst;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2944 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2945
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2946 ngx_memcpy(dst, src, size);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2947
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2948 return dst;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2949 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2950
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
2951
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2952 static ngx_addr_t *
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2953 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
2954 ngx_uint_t rotate)
4871
c85cefbdaafe Resolver: cached addresses are returned with random rotation now.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4784
diff changeset
2955 {
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2956 ngx_addr_t *dst;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2957 ngx_uint_t d, i, j, n;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2958 u_char (*sockaddr)[NGX_SOCKADDRLEN];
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2959 in_addr_t *addr;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2960 struct sockaddr_in *sin;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2961 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2962 struct in6_addr *addr6;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2963 struct sockaddr_in6 *sin6;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2964 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2965
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2966 n = rn->naddrs;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2967 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2968 n += rn->naddrs6;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2969 #endif
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2970
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2971 dst = ngx_resolver_calloc(r, n * sizeof(ngx_addr_t));
4892
063ac68d89dc Resolver: added missing memory allocation error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4871
diff changeset
2972 if (dst == NULL) {
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2973 return NULL;
4892
063ac68d89dc Resolver: added missing memory allocation error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4871
diff changeset
2974 }
063ac68d89dc Resolver: added missing memory allocation error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4871
diff changeset
2975
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2976 sockaddr = ngx_resolver_calloc(r, n * NGX_SOCKADDRLEN);
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2977 if (sockaddr == NULL) {
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2978 ngx_resolver_free(r, dst);
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
2979 return NULL;
4871
c85cefbdaafe Resolver: cached addresses are returned with random rotation now.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4784
diff changeset
2980 }
c85cefbdaafe Resolver: cached addresses are returned with random rotation now.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4784
diff changeset
2981
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2982 i = 0;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2983 d = rotate ? ngx_random() % n : 0;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2984
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2985 if (rn->naddrs) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2986 j = rotate ? ngx_random() % rn->naddrs : 0;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2987
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2988 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
2989
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2990 do {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2991 sin = (struct sockaddr_in *) sockaddr[d];
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2992 sin->sin_family = AF_INET;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2993 sin->sin_addr.s_addr = addr[j++];
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2994 dst[d].sockaddr = (struct sockaddr *) sin;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2995 dst[d++].socklen = sizeof(struct sockaddr_in);
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2996
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2997 if (d == n) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2998 d = 0;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
2999 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3000
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3001 if (j == rn->naddrs) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3002 j = 0;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3003 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3004 } while (++i < rn->naddrs);
5475
07dd5bd222ac Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents: 5474
diff changeset
3005 }
4871
c85cefbdaafe Resolver: cached addresses are returned with random rotation now.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4784
diff changeset
3006
5477
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3007 #if (NGX_HAVE_INET6)
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3008 if (rn->naddrs6) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3009 j = rotate ? ngx_random() % rn->naddrs6 : 0;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3010
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3011 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
3012
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3013 do {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3014 sin6 = (struct sockaddr_in6 *) sockaddr[d];
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3015 sin6->sin6_family = AF_INET6;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3016 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
3017 dst[d].sockaddr = (struct sockaddr *) sin6;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3018 dst[d++].socklen = sizeof(struct sockaddr_in6);
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3019
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3020 if (d == n) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3021 d = 0;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3022 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3023
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3024 if (j == rn->naddrs6) {
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3025 j = 0;
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3026 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3027 } while (++i < n);
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3028 }
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3029 #endif
98876ce2a7fd Resolver: implemented IPv6 name to address resolving.
Ruslan Ermilov <ru@nginx.com>
parents: 5476
diff changeset
3030
4871
c85cefbdaafe Resolver: cached addresses are returned with random rotation now.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4784
diff changeset
3031 return dst;
c85cefbdaafe Resolver: cached addresses are returned with random rotation now.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4784
diff changeset
3032 }
c85cefbdaafe Resolver: cached addresses are returned with random rotation now.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4784
diff changeset
3033
c85cefbdaafe Resolver: cached addresses are returned with random rotation now.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4784
diff changeset
3034
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3035 char *
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3036 ngx_resolver_strerror(ngx_int_t err)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3037 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3038 static char *errors[] = {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3039 "Format error", /* FORMERR */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3040 "Server failure", /* SERVFAIL */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3041 "Host not found", /* NXDOMAIN */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3042 "Unimplemented", /* NOTIMP */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3043 "Operation refused" /* REFUSED */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3044 };
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3045
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3046 if (err > 0 && err < 6) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3047 return errors[err - 1];
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3048 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3049
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3050 if (err == NGX_RESOLVE_TIMEDOUT) {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3051 return "Operation timed out";
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3052 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3053
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3054 return "Unknown error";
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3055 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3056
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3057
3408
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3058 static u_char *
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3059 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
3060 {
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3061 u_char *p;
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3062 ngx_udp_connection_t *uc;
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3063
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3064 p = buf;
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3065
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3066 if (log->action) {
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3067 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
3068 len -= p - buf;
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3069 }
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3070
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3071 uc = log->data;
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3072
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3073 if (uc) {
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3074 p = ngx_snprintf(p, len, ", resolver: %V", &uc->server);
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3075 }
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3076
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3077 return p;
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3078 }
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3079
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3080
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3081 ngx_int_t
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3082 ngx_udp_connect(ngx_udp_connection_t *uc)
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3083 {
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3084 int rc;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3085 ngx_int_t event;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3086 ngx_event_t *rev, *wev;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3087 ngx_socket_t s;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3088 ngx_connection_t *c;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3089
4671
af9342747669 Support for IPv6 literals and an optional port in resolver.
Ruslan Ermilov <ru@nginx.com>
parents: 4653
diff changeset
3090 s = ngx_socket(uc->sockaddr->sa_family, SOCK_DGRAM, 0);
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3091
3408
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3092 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, &uc->log, 0, "UDP socket %d", s);
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3093
5360
3d2d3e1cf427 Win32: MinGW GCC compatibility.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4892
diff changeset
3094 if (s == (ngx_socket_t) -1) {
3408
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3095 ngx_log_error(NGX_LOG_ALERT, &uc->log, ngx_socket_errno,
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3096 ngx_socket_n " failed");
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3097 return NGX_ERROR;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3098 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3099
3408
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3100 c = ngx_get_connection(s, &uc->log);
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3101
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3102 if (c == NULL) {
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3103 if (ngx_close_socket(s) == -1) {
3408
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3104 ngx_log_error(NGX_LOG_ALERT, &uc->log, ngx_socket_errno,
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3105 ngx_close_socket_n "failed");
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3106 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3107
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3108 return NGX_ERROR;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3109 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3110
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3111 if (ngx_nonblocking(s) == -1) {
3408
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3112 ngx_log_error(NGX_LOG_ALERT, &uc->log, ngx_socket_errno,
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3113 ngx_nonblocking_n " failed");
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3114
5582
545a4d393e2f Resolver: properly handle connect() failures.
Ruslan Ermilov <ru@nginx.com>
parents: 5505
diff changeset
3115 goto failed;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3116 }
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3117
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3118 rev = c->read;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3119 wev = c->write;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3120
3408
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3121 rev->log = &uc->log;
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3122 wev->log = &uc->log;
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3123
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3124 uc->connection = c;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3125
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3126 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
3127
3408
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3128 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, &uc->log, 0,
5600
957d734362ed Fixed format specifier in logging of "c->number".
Sergey Kandaurov <pluknet@nginx.com>
parents: 5582
diff changeset
3129 "connect to %V, fd:%d #%uA", &uc->server, s, c->number);
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3130
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3131 rc = connect(s, uc->sockaddr, uc->socklen);
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3132
6125
4dc8e7b62216 Removed the obsolete aio module.
Ruslan Ermilov <ru@nginx.com>
parents: 5921
diff changeset
3133 /* TODO: iocp */
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3134
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3135 if (rc == -1) {
3408
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3136 ngx_log_error(NGX_LOG_CRIT, &uc->log, ngx_socket_errno,
71193a456616 add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents: 3376
diff changeset
3137 "connect() failed");
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3138
5582
545a4d393e2f Resolver: properly handle connect() failures.
Ruslan Ermilov <ru@nginx.com>
parents: 5505
diff changeset
3139 goto failed;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3140 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3141
1649
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3142 /* UDP sockets are always ready to write */
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3143 wev->ready = 1;
80901499140d resolver
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
3144
6126
adba26ff70b5 Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents: 6125
diff changeset
3145 event = (ngx_event_flags & NGX_USE_CLEAR_EVENT) ?
adba26ff70b5 Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents: 6125
diff changeset
3146 /* kqueue, epoll */ NGX_CLEAR_EVENT:
adba26ff70b5 Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents: 6125
diff changeset
3147 /* select, poll, /dev/poll */ NGX_LEVEL_EVENT;
adba26ff70b5 Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents: 6125
diff changeset
3148 /* eventport event type has no meaning: oneshot only */
adba26ff70b5 Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents: 6125
diff changeset
3149
adba26ff70b5 Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents: 6125
diff changeset
3150 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
3151 goto failed;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3152 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3153
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3154 return NGX_OK;
5582
545a4d393e2f Resolver: properly handle connect() failures.
Ruslan Ermilov <ru@nginx.com>
parents: 5505
diff changeset
3155
545a4d393e2f Resolver: properly handle connect() failures.
Ruslan Ermilov <ru@nginx.com>
parents: 5505
diff changeset
3156 failed:
545a4d393e2f Resolver: properly handle connect() failures.
Ruslan Ermilov <ru@nginx.com>
parents: 5505
diff changeset
3157
545a4d393e2f Resolver: properly handle connect() failures.
Ruslan Ermilov <ru@nginx.com>
parents: 5505
diff changeset
3158 ngx_close_connection(c);
545a4d393e2f Resolver: properly handle connect() failures.
Ruslan Ermilov <ru@nginx.com>
parents: 5505
diff changeset
3159 uc->connection = NULL;
545a4d393e2f Resolver: properly handle connect() failures.
Ruslan Ermilov <ru@nginx.com>
parents: 5505
diff changeset
3160
545a4d393e2f Resolver: properly handle connect() failures.
Ruslan Ermilov <ru@nginx.com>
parents: 5505
diff changeset
3161 return NGX_ERROR;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3162 }