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);