comparison src/core/ngx_resolver.c @ 504:706fef7f4dcc NGINX_0_7_64

nginx 0.7.64 *) Security: now SSL/TLS renegotiation is disabled. Thanks to Maxim Dounin. *) Bugfix: nginx sent gzipped responses to clients those do not support gzip, if "gzip_static on" and "gzip_vary off"; the bug had appeared in 0.7.63. *) Bugfix: if names .domain.tld, .sub.domain.tld, and .domain-some.tld were defined, then the name .sub.domain.tld was matched by .domain.tld. *) Bugfix: segmentation fault and infinite looping in resolver. *) Bugfix: in resolver. Thanks to Artem Bokhan. *) Bugfix: resolver cache poisoning. Thanks to Matthew Dempsky. *) Bugfix: memory leak in resolver. Thanks to Matthew Dempsky.
author Igor Sysoev <http://sysoev.ru>
date Mon, 16 Nov 2009 00:00:00 +0300
parents ed5e10fb40fc
children
comparison
equal deleted inserted replaced
503:bedade69b1a4 504:706fef7f4dcc
462 462
463 if (rn->waiting) { 463 if (rn->waiting) {
464 464
465 ctx->next = rn->waiting; 465 ctx->next = rn->waiting;
466 rn->waiting = ctx; 466 rn->waiting = ctx;
467 ctx->state = NGX_AGAIN;
467 468
468 return NGX_AGAIN; 469 return NGX_AGAIN;
469 } 470 }
470 471
471 ngx_queue_remove(&rn->queue); 472 ngx_queue_remove(&rn->queue);
623 624
624 if (rn->waiting) { 625 if (rn->waiting) {
625 626
626 ctx->next = rn->waiting; 627 ctx->next = rn->waiting;
627 rn->waiting = ctx; 628 rn->waiting = ctx;
629 ctx->state = NGX_AGAIN;
628 630
629 /* unlock addr mutex */ 631 /* unlock addr mutex */
630 632
631 return NGX_OK; 633 return NGX_OK;
632 } 634 }
1147 "wrong ident %ui response for %V, expect %ui", 1149 "wrong ident %ui response for %V, expect %ui",
1148 ident, &name, qident); 1150 ident, &name, qident);
1149 goto failed; 1151 goto failed;
1150 } 1152 }
1151 1153
1154 ngx_resolver_free(r, name.data);
1155
1152 if (code == 0 && nan == 0) { 1156 if (code == 0 && nan == 0) {
1153 code = 3; /* NXDOMAIN */ 1157 code = 3; /* NXDOMAIN */
1154 } 1158 }
1155 1159
1156 if (code) { 1160 if (code) {
1397 return; 1401 return;
1398 1402
1399 failed: 1403 failed:
1400 1404
1401 /* unlock name mutex */ 1405 /* unlock name mutex */
1406
1407 ngx_resolver_free(r, name.data);
1402 1408
1403 return; 1409 return;
1404 } 1410 }
1405 1411
1406 1412
1593 1599
1594 static ngx_resolver_node_t * 1600 static ngx_resolver_node_t *
1595 ngx_resolver_lookup_name(ngx_resolver_t *r, ngx_str_t *name, uint32_t hash) 1601 ngx_resolver_lookup_name(ngx_resolver_t *r, ngx_str_t *name, uint32_t hash)
1596 { 1602 {
1597 ngx_int_t rc; 1603 ngx_int_t rc;
1598 size_t len;
1599 ngx_rbtree_node_t *node, *sentinel; 1604 ngx_rbtree_node_t *node, *sentinel;
1600 ngx_resolver_node_t *rn; 1605 ngx_resolver_node_t *rn;
1601 1606
1602 node = r->name_rbtree.root; 1607 node = r->name_rbtree.root;
1603 sentinel = r->name_rbtree.sentinel; 1608 sentinel = r->name_rbtree.sentinel;
1617 /* hash == node->key */ 1622 /* hash == node->key */
1618 1623
1619 do { 1624 do {
1620 rn = (ngx_resolver_node_t *) node; 1625 rn = (ngx_resolver_node_t *) node;
1621 1626
1622 len = (name->len > (size_t) rn->nlen) ? rn->nlen : name->len; 1627 rc = ngx_memn2cmp(name->data, rn->name, name->len, rn->nlen);
1623
1624 rc = ngx_strncmp(name->data, rn->name, len);
1625 1628
1626 if (rc == 0) { 1629 if (rc == 0) {
1627 return rn; 1630 return rn;
1628 } 1631 }
1629 1632
1673 1676
1674 static void 1677 static void
1675 ngx_resolver_rbtree_insert_value(ngx_rbtree_node_t *temp, 1678 ngx_resolver_rbtree_insert_value(ngx_rbtree_node_t *temp,
1676 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel) 1679 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
1677 { 1680 {
1678 size_t len;
1679 ngx_rbtree_node_t **p; 1681 ngx_rbtree_node_t **p;
1680 ngx_resolver_node_t *rn, *rn_temp; 1682 ngx_resolver_node_t *rn, *rn_temp;
1681 1683
1682 for ( ;; ) { 1684 for ( ;; ) {
1683 1685
1692 } else { /* node->key == temp->key */ 1694 } else { /* node->key == temp->key */
1693 1695
1694 rn = (ngx_resolver_node_t *) node; 1696 rn = (ngx_resolver_node_t *) node;
1695 rn_temp = (ngx_resolver_node_t *) temp; 1697 rn_temp = (ngx_resolver_node_t *) temp;
1696 1698
1697 len = (rn->nlen > rn_temp->nlen) ? rn_temp->nlen : rn->nlen; 1699 p = (ngx_memn2cmp(rn->name, rn_temp->name, rn->nlen, rn_temp->nlen)
1698 1700 < 0) ? &temp->left : &temp->right;
1699 p = (ngx_strncmp(rn->name, rn_temp->name, len) < 0)
1700 ? &temp->left : &temp->right;
1701 } 1701 }
1702 1702
1703 if (*p == sentinel) { 1703 if (*p == sentinel) {
1704 break; 1704 break;
1705 } 1705 }
1717 1717
1718 static ngx_int_t 1718 static ngx_int_t
1719 ngx_resolver_create_name_query(ngx_resolver_node_t *rn, ngx_resolver_ctx_t *ctx) 1719 ngx_resolver_create_name_query(ngx_resolver_node_t *rn, ngx_resolver_ctx_t *ctx)
1720 { 1720 {
1721 u_char *p, *s; 1721 u_char *p, *s;
1722 size_t len; 1722 size_t len, nlen;
1723 ngx_uint_t ident; 1723 ngx_uint_t ident;
1724 ngx_resolver_qs_t *qs; 1724 ngx_resolver_qs_t *qs;
1725 ngx_resolver_query_t *query; 1725 ngx_resolver_query_t *query;
1726 1726
1727 len = sizeof(ngx_resolver_query_t) 1727 nlen = ctx->name.len ? (1 + ctx->name.len + 1) : 1;
1728 + 1 + ctx->name.len + 1 + sizeof(ngx_resolver_qs_t); 1728
1729 1729 len = sizeof(ngx_resolver_query_t) + nlen + sizeof(ngx_resolver_qs_t);
1730 p = ngx_resolver_calloc(ctx->resolver, len); 1730
1731 p = ngx_resolver_alloc(ctx->resolver, len);
1731 if (p == NULL) { 1732 if (p == NULL) {
1732 return NGX_ERROR; 1733 return NGX_ERROR;
1733 } 1734 }
1734 1735
1735 rn->qlen = (u_short) len; 1736 rn->qlen = (u_short) len;
1752 query->nqs_hi = 0; query->nqs_lo = 1; 1753 query->nqs_hi = 0; query->nqs_lo = 1;
1753 query->nan_hi = 0; query->nan_lo = 0; 1754 query->nan_hi = 0; query->nan_lo = 0;
1754 query->nns_hi = 0; query->nns_lo = 0; 1755 query->nns_hi = 0; query->nns_lo = 0;
1755 query->nar_hi = 0; query->nar_lo = 0; 1756 query->nar_hi = 0; query->nar_lo = 0;
1756 1757
1757 p += sizeof(ngx_resolver_query_t) + 1 + ctx->name.len + 1; 1758 p += sizeof(ngx_resolver_query_t) + nlen;
1758 1759
1759 qs = (ngx_resolver_qs_t *) p; 1760 qs = (ngx_resolver_qs_t *) p;
1760 1761
1761 /* query type */ 1762 /* query type */
1762 qs->type_hi = 0; qs->type_lo = (u_char) ctx->type; 1763 qs->type_hi = 0; qs->type_lo = (u_char) ctx->type;
1806 1807
1807 len = sizeof(ngx_resolver_query_t) 1808 len = sizeof(ngx_resolver_query_t)
1808 + sizeof(".255.255.255.255.in-addr.arpa.") - 1 1809 + sizeof(".255.255.255.255.in-addr.arpa.") - 1
1809 + sizeof(ngx_resolver_qs_t); 1810 + sizeof(ngx_resolver_qs_t);
1810 1811
1811 p = ngx_resolver_calloc(ctx->resolver, len); 1812 p = ngx_resolver_alloc(ctx->resolver, len);
1812 if (p == NULL) { 1813 if (p == NULL) {
1813 return NGX_ERROR; 1814 return NGX_ERROR;
1814 } 1815 }
1815 1816
1816 rn->query = p; 1817 rn->query = p;
1897 return NGX_ERROR; 1898 return NGX_ERROR;
1898 1899
1899 done: 1900 done:
1900 1901
1901 if (name == NULL) { 1902 if (name == NULL) {
1903 return NGX_OK;
1904 }
1905
1906 if (len == -1) {
1907 name->len = 0;
1908 name->data = NULL;
1902 return NGX_OK; 1909 return NGX_OK;
1903 } 1910 }
1904 1911
1905 dst = ngx_resolver_alloc(r, len); 1912 dst = ngx_resolver_alloc(r, len);
1906 if (dst == NULL) { 1913 if (dst == NULL) {