Mercurial > hg > nginx-vendor-current
comparison src/core/ngx_resolver.c @ 442:670af56a1158 NGINX_0_7_33
nginx 0.7.33
*) Bugfix: a double response might be returned if the epoll or rtsig
methods are used and a redirect was returned to a request with
body.
Thanks to Eden Li.
*) Bugfix: the $sent_http_location variable was empty for some
redirects types.
*) Bugfix: a segmentation fault might occur in worker process if
"resolver" directive was used in SMTP proxy.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Mon, 02 Feb 2009 00:00:00 +0300 |
parents | ad0a34a8efa6 |
children | ed5e10fb40fc |
comparison
equal
deleted
inserted
replaced
441:52bbf0e6dfad | 442:670af56a1158 |
---|---|
576 | 576 |
577 | 577 |
578 ngx_int_t | 578 ngx_int_t |
579 ngx_resolve_addr(ngx_resolver_ctx_t *ctx) | 579 ngx_resolve_addr(ngx_resolver_ctx_t *ctx) |
580 { | 580 { |
581 u_char *name; | |
581 ngx_resolver_t *r; | 582 ngx_resolver_t *r; |
582 ngx_resolver_node_t *rn; | 583 ngx_resolver_node_t *rn; |
583 | 584 |
584 r = ctx->resolver; | 585 r = ctx->resolver; |
585 | 586 |
599 | 600 |
600 rn->expire = ngx_time() + r->expire; | 601 rn->expire = ngx_time() + r->expire; |
601 | 602 |
602 ngx_queue_insert_head(&r->addr_expire_queue, &rn->queue); | 603 ngx_queue_insert_head(&r->addr_expire_queue, &rn->queue); |
603 | 604 |
604 ctx->name.len = rn->nlen; | 605 name = ngx_resolver_dup(r, rn->name, rn->nlen); |
605 ctx->name.data = ngx_resolver_dup(r, rn->name, rn->nlen); | 606 if (name == NULL) { |
606 if (ctx->name.data == NULL) { | |
607 goto failed; | 607 goto failed; |
608 } | 608 } |
609 | 609 |
610 ctx->name.len = rn->nlen; | |
611 ctx->name.data = name; | |
612 | |
610 /* unlock addr mutex */ | 613 /* unlock addr mutex */ |
611 | 614 |
612 ctx->state = NGX_OK; | 615 ctx->state = NGX_OK; |
613 | 616 |
614 ctx->handler(ctx); | 617 ctx->handler(ctx); |
615 | 618 |
616 ngx_resolver_free(r, ctx->name.data); | 619 ngx_resolver_free(r, name); |
617 | 620 |
618 return NGX_OK; | 621 return NGX_OK; |
619 } | 622 } |
620 | 623 |
621 if (rn->waiting) { | 624 if (rn->waiting) { |
622 | 625 |
623 ctx->next = rn->waiting; | 626 ctx->next = rn->waiting; |
624 rn->waiting = ctx; | 627 rn->waiting = ctx; |
625 | 628 |
626 return NGX_AGAIN; | 629 /* unlock addr mutex */ |
630 | |
631 return NGX_OK; | |
627 } | 632 } |
628 | 633 |
629 ngx_queue_remove(&rn->queue); | 634 ngx_queue_remove(&rn->queue); |
630 | 635 |
631 ngx_resolver_free(r, rn->query); | 636 ngx_resolver_free(r, rn->query); |
1334 next = ctx->next; | 1339 next = ctx->next; |
1335 | 1340 |
1336 ctx->handler(ctx); | 1341 ctx->handler(ctx); |
1337 } | 1342 } |
1338 | 1343 |
1339 if (naddrs) { | 1344 if (naddrs > 1) { |
1340 ngx_resolver_free(r, addrs); | 1345 ngx_resolver_free(r, addrs); |
1341 } | 1346 } |
1342 | 1347 |
1343 return; | 1348 return; |
1344 | 1349 |
1511 | 1516 |
1512 if (i + len > (ngx_uint_t) n) { | 1517 if (i + len > (ngx_uint_t) n) { |
1513 goto short_response; | 1518 goto short_response; |
1514 } | 1519 } |
1515 | 1520 |
1516 len -= 2; | |
1517 | |
1518 if (ngx_resolver_copy(r, &name, buf, &buf[i], &buf[n]) != NGX_OK) { | 1521 if (ngx_resolver_copy(r, &name, buf, &buf[i], &buf[n]) != NGX_OK) { |
1519 return; | 1522 return; |
1520 } | 1523 } |
1521 | 1524 |
1522 ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0, "resolver an:%V", &name); | 1525 ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0, "resolver an:%V", &name); |
1523 | 1526 |
1524 if (len != (size_t) rn->nlen || ngx_strncmp(name.data, rn->name, len) != 0) | 1527 if (name.len != (size_t) rn->nlen |
1528 || ngx_strncmp(name.data, rn->name, name.len) != 0) | |
1525 { | 1529 { |
1526 ngx_resolver_free(r, rn->name); | 1530 if (rn->nlen) { |
1531 ngx_resolver_free(r, rn->name); | |
1532 } | |
1533 | |
1534 rn->nlen = (u_short) name.len; | |
1527 rn->name = name.data; | 1535 rn->name = name.data; |
1528 | 1536 |
1529 name.data = ngx_resolver_dup(r, rn->name, len); | 1537 name.data = ngx_resolver_dup(r, rn->name, name.len); |
1530 if (name.data == NULL) { | 1538 if (name.data == NULL) { |
1531 goto failed; | 1539 goto failed; |
1532 } | 1540 } |
1533 } | 1541 } |
1534 | 1542 |