comparison src/core/ngx_resolver.c @ 528:005a70f9573b NGINX_0_8_16

nginx 0.8.16 *) Feature: the "image_filter_transparency" directive. *) Bugfix: "addition_types" directive was incorrectly named "addtion_types". *) Bugfix: resolver cache poisoning. Thanks to Matthew Dempsky. *) Bugfix: memory leak in resolver. Thanks to Matthew Dempsky. *) Bugfix: invalid request line in $request variable was written in access_log only if error_log was set to "info" or "debug" level. *) Bugfix: in PNG alpha-channel support in the ngx_http_image_filter_module. *) Bugfix: nginx always added "Vary: Accept-Encoding" response header line, if both "gzip_static" and "gzip_vary" were on. *) Bugfix: in UTF-8 encoding support by "try_files" directive in nginx/Windows. *) Bugfix: in "post_action" directive usage; the bug had appeared in 0.8.11. Thanks to Igor Artemiev.
author Igor Sysoev <http://sysoev.ru>
date Tue, 22 Sep 2009 00:00:00 +0400
parents ed5e10fb40fc
children c04fa65fe604
comparison
equal deleted inserted replaced
527:a607f3a5aefe 528:005a70f9573b
1147 "wrong ident %ui response for %V, expect %ui", 1147 "wrong ident %ui response for %V, expect %ui",
1148 ident, &name, qident); 1148 ident, &name, qident);
1149 goto failed; 1149 goto failed;
1150 } 1150 }
1151 1151
1152 ngx_resolver_free(r, name.data);
1153
1152 if (code == 0 && nan == 0) { 1154 if (code == 0 && nan == 0) {
1153 code = 3; /* NXDOMAIN */ 1155 code = 3; /* NXDOMAIN */
1154 } 1156 }
1155 1157
1156 if (code) { 1158 if (code) {
1397 return; 1399 return;
1398 1400
1399 failed: 1401 failed:
1400 1402
1401 /* unlock name mutex */ 1403 /* unlock name mutex */
1404
1405 ngx_resolver_free(r, name.data);
1402 1406
1403 return; 1407 return;
1404 } 1408 }
1405 1409
1406 1410
1593 1597
1594 static ngx_resolver_node_t * 1598 static ngx_resolver_node_t *
1595 ngx_resolver_lookup_name(ngx_resolver_t *r, ngx_str_t *name, uint32_t hash) 1599 ngx_resolver_lookup_name(ngx_resolver_t *r, ngx_str_t *name, uint32_t hash)
1596 { 1600 {
1597 ngx_int_t rc; 1601 ngx_int_t rc;
1598 size_t len;
1599 ngx_rbtree_node_t *node, *sentinel; 1602 ngx_rbtree_node_t *node, *sentinel;
1600 ngx_resolver_node_t *rn; 1603 ngx_resolver_node_t *rn;
1601 1604
1602 node = r->name_rbtree.root; 1605 node = r->name_rbtree.root;
1603 sentinel = r->name_rbtree.sentinel; 1606 sentinel = r->name_rbtree.sentinel;
1617 /* hash == node->key */ 1620 /* hash == node->key */
1618 1621
1619 do { 1622 do {
1620 rn = (ngx_resolver_node_t *) node; 1623 rn = (ngx_resolver_node_t *) node;
1621 1624
1622 len = (name->len > (size_t) rn->nlen) ? rn->nlen : name->len; 1625 rc = ngx_memn2cmp(name->data, rn->name, name->len, rn->nlen);
1623
1624 rc = ngx_strncmp(name->data, rn->name, len);
1625 1626
1626 if (rc == 0) { 1627 if (rc == 0) {
1627 return rn; 1628 return rn;
1628 } 1629 }
1629 1630
1673 1674
1674 static void 1675 static void
1675 ngx_resolver_rbtree_insert_value(ngx_rbtree_node_t *temp, 1676 ngx_resolver_rbtree_insert_value(ngx_rbtree_node_t *temp,
1676 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel) 1677 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
1677 { 1678 {
1678 size_t len;
1679 ngx_rbtree_node_t **p; 1679 ngx_rbtree_node_t **p;
1680 ngx_resolver_node_t *rn, *rn_temp; 1680 ngx_resolver_node_t *rn, *rn_temp;
1681 1681
1682 for ( ;; ) { 1682 for ( ;; ) {
1683 1683
1692 } else { /* node->key == temp->key */ 1692 } else { /* node->key == temp->key */
1693 1693
1694 rn = (ngx_resolver_node_t *) node; 1694 rn = (ngx_resolver_node_t *) node;
1695 rn_temp = (ngx_resolver_node_t *) temp; 1695 rn_temp = (ngx_resolver_node_t *) temp;
1696 1696
1697 len = (rn->nlen > rn_temp->nlen) ? rn_temp->nlen : rn->nlen; 1697 p = (ngx_memn2cmp(rn->name, rn_temp->name, rn->nlen, rn_temp->nlen)
1698 1698 < 0) ? &temp->left : &temp->right;
1699 p = (ngx_strncmp(rn->name, rn_temp->name, len) < 0)
1700 ? &temp->left : &temp->right;
1701 } 1699 }
1702 1700
1703 if (*p == sentinel) { 1701 if (*p == sentinel) {
1704 break; 1702 break;
1705 } 1703 }