store name pointer in variable allocated on stack
as resolver ctx may be already deallocated at this point
Igor Sysoev
13 years ago
577 | 577 | ngx_int_t |
578 | 578 | ngx_resolve_addr(ngx_resolver_ctx_t *ctx) |
579 | 579 | { |
580 | u_char *name; | |
580 | 581 | ngx_resolver_t *r; |
581 | 582 | ngx_resolver_node_t *rn; |
582 | 583 | |
600 | 601 | |
601 | 602 | ngx_queue_insert_head(&r->addr_expire_queue, &rn->queue); |
602 | 603 | |
603 | ctx->name.len = rn->nlen; | |
604 | ctx->name.data = ngx_resolver_dup(r, rn->name, rn->nlen); | |
605 | if (ctx->name.data == NULL) { | |
604 | name = ngx_resolver_dup(r, rn->name, rn->nlen); | |
605 | if (name == NULL) { | |
606 | 606 | goto failed; |
607 | 607 | } |
608 | 608 | |
609 | ctx->name.len = rn->nlen; | |
610 | ctx->name.data = name; | |
611 | ||
609 | 612 | /* unlock addr mutex */ |
610 | 613 | |
611 | 614 | ctx->state = NGX_OK; |
612 | 615 | |
613 | 616 | ctx->handler(ctx); |
614 | 617 | |
615 | ngx_resolver_free(r, ctx->name.data); | |
618 | ngx_resolver_free(r, name); | |
616 | 619 | |
617 | 620 | return NGX_OK; |
618 | 621 | } |