Mercurial > hg > nginx
comparison src/core/ngx_resolver.c @ 1742:268b81386fe4
no answers in DNS response should be NXDOMAIN
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Sun, 16 Dec 2007 20:47:55 +0000 |
parents | 0829024c924d |
children | 68d21fd1dc64 |
comparison
equal
deleted
inserted
replaced
1741:0829024c924d | 1742:268b81386fe4 |
---|---|
65 ngx_queue_t *queue); | 65 ngx_queue_t *queue); |
66 static void ngx_resolver_read_response(ngx_event_t *rev); | 66 static void ngx_resolver_read_response(ngx_event_t *rev); |
67 static void ngx_resolver_process_response(ngx_resolver_t *r, u_char *buf, | 67 static void ngx_resolver_process_response(ngx_resolver_t *r, u_char *buf, |
68 size_t n); | 68 size_t n); |
69 static void ngx_resolver_process_a(ngx_resolver_t *r, u_char *buf, size_t n, | 69 static void ngx_resolver_process_a(ngx_resolver_t *r, u_char *buf, size_t n, |
70 ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan, ngx_uint_t i); | 70 ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan, ngx_uint_t ans); |
71 static void ngx_resolver_process_ptr(ngx_resolver_t *r, u_char *buf, size_t n, | 71 static void ngx_resolver_process_ptr(ngx_resolver_t *r, u_char *buf, size_t n, |
72 ngx_uint_t ident, ngx_uint_t code); | 72 ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan); |
73 static ngx_resolver_node_t *ngx_resolver_lookup_name(ngx_resolver_t *r, | 73 static ngx_resolver_node_t *ngx_resolver_lookup_name(ngx_resolver_t *r, |
74 ngx_str_t *name, uint32_t hash); | 74 ngx_str_t *name, uint32_t hash); |
75 static ngx_resolver_node_t *ngx_resolver_lookup_addr(ngx_resolver_t *r, | 75 static ngx_resolver_node_t *ngx_resolver_lookup_addr(ngx_resolver_t *r, |
76 in_addr_t addr); | 76 in_addr_t addr); |
77 static void ngx_resolver_rbtree_insert_value(ngx_rbtree_node_t *temp, | 77 static void ngx_resolver_rbtree_insert_value(ngx_rbtree_node_t *temp, |
882 if (nqs != 1) { | 882 if (nqs != 1) { |
883 err = "invalid number of questions in DNS response"; | 883 err = "invalid number of questions in DNS response"; |
884 goto done; | 884 goto done; |
885 } | 885 } |
886 | 886 |
887 if (code == 0 && nan == 0) { | |
888 err = "no answers in DNS response"; | |
889 goto done; | |
890 } | |
891 | |
892 i = sizeof(ngx_resolver_query_t); | 887 i = sizeof(ngx_resolver_query_t); |
893 | 888 |
894 while (i < (ngx_uint_t) n) { | 889 while (i < (ngx_uint_t) n) { |
895 if (buf[i] == '\0') { | 890 if (buf[i] == '\0') { |
896 goto found; | 891 goto found; |
932 switch (qtype) { | 927 switch (qtype) { |
933 | 928 |
934 case NGX_RESOLVE_A: | 929 case NGX_RESOLVE_A: |
935 | 930 |
936 ngx_resolver_process_a(r, buf, n, ident, code, nan, | 931 ngx_resolver_process_a(r, buf, n, ident, code, nan, |
937 i + sizeof(ngx_resolver_qs_t)); | 932 i + sizeof(ngx_resolver_qs_t)); |
938 | 933 |
939 break; | 934 break; |
940 | 935 |
941 case NGX_RESOLVE_PTR: | 936 case NGX_RESOLVE_PTR: |
942 | 937 |
943 ngx_resolver_process_ptr(r, buf, n, ident, code); | 938 ngx_resolver_process_ptr(r, buf, n, ident, code, nan); |
944 | 939 |
945 break; | 940 break; |
946 | 941 |
947 default: | 942 default: |
948 ngx_log_error(r->log_level, r->log, 0, | 943 ngx_log_error(r->log_level, r->log, 0, |
1004 "wrong ident %d response for %V, expect %d", | 999 "wrong ident %d response for %V, expect %d", |
1005 ident, &name, qident); | 1000 ident, &name, qident); |
1006 goto failed; | 1001 goto failed; |
1007 } | 1002 } |
1008 | 1003 |
1004 if (code == 0 && nan == 0) { | |
1005 code = 3; /* NXDOMAIN */ | |
1006 } | |
1007 | |
1009 if (code) { | 1008 if (code) { |
1010 next = rn->waiting; | 1009 next = rn->waiting; |
1011 rn->waiting = NULL; | 1010 rn->waiting = NULL; |
1012 | 1011 |
1013 ngx_queue_remove(&rn->queue); | 1012 ngx_queue_remove(&rn->queue); |
1250 } | 1249 } |
1251 | 1250 |
1252 | 1251 |
1253 static void | 1252 static void |
1254 ngx_resolver_process_ptr(ngx_resolver_t *r, u_char *buf, size_t n, | 1253 ngx_resolver_process_ptr(ngx_resolver_t *r, u_char *buf, size_t n, |
1255 ngx_uint_t ident, ngx_uint_t code) | 1254 ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan) |
1256 { | 1255 { |
1257 char *err; | 1256 char *err; |
1258 size_t len; | 1257 size_t len; |
1259 in_addr_t addr; | 1258 in_addr_t addr; |
1260 ngx_int_t digit; | 1259 ngx_int_t digit; |
1307 ident, (addr >> 24) & 0xff, (addr >> 16) & 0xff, | 1306 ident, (addr >> 24) & 0xff, (addr >> 16) & 0xff, |
1308 (addr >> 8) & 0xff, addr & 0xff, qident); | 1307 (addr >> 8) & 0xff, addr & 0xff, qident); |
1309 goto failed; | 1308 goto failed; |
1310 } | 1309 } |
1311 | 1310 |
1311 if (code == 0 && nan == 0) { | |
1312 code = 3; /* NXDOMAIN */ | |
1313 } | |
1314 | |
1312 if (code) { | 1315 if (code) { |
1313 next = rn->waiting; | 1316 next = rn->waiting; |
1314 rn->waiting = NULL; | 1317 rn->waiting = NULL; |
1315 | 1318 |
1316 ngx_queue_remove(&rn->queue); | 1319 ngx_queue_remove(&rn->queue); |