Mercurial > hg > nginx
comparison src/core/ngx_resolver.c @ 1960:1609b3c3d604
fix memory leak on resolver query send failure
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Wed, 09 Apr 2008 14:26:08 +0000 |
parents | d02fb350d17d |
children | 99b9feacccb4 |
comparison
equal
deleted
inserted
replaced
1959:4f16186f5603 | 1960:1609b3c3d604 |
---|---|
451 ngx_queue_remove(&rn->queue); | 451 ngx_queue_remove(&rn->queue); |
452 | 452 |
453 /* lock alloc mutex */ | 453 /* lock alloc mutex */ |
454 | 454 |
455 ngx_resolver_free_locked(r, rn->query); | 455 ngx_resolver_free_locked(r, rn->query); |
456 rn->query = NULL; | |
456 | 457 |
457 if (rn->cnlen) { | 458 if (rn->cnlen) { |
458 ngx_resolver_free_locked(r, rn->u.cname); | 459 ngx_resolver_free_locked(r, rn->u.cname); |
459 } | 460 } |
460 | 461 |
477 return NGX_ERROR; | 478 return NGX_ERROR; |
478 } | 479 } |
479 | 480 |
480 rn->node.key = hash; | 481 rn->node.key = hash; |
481 rn->nlen = (u_short) ctx->name.len; | 482 rn->nlen = (u_short) ctx->name.len; |
483 rn->query = NULL; | |
482 | 484 |
483 ngx_rbtree_insert(&r->name_rbtree, &rn->node); | 485 ngx_rbtree_insert(&r->name_rbtree, &rn->node); |
484 } | 486 } |
485 | 487 |
486 if (ngx_resolver_create_name_query(rn, ctx) != NGX_OK) { | 488 if (ngx_resolver_create_name_query(rn, ctx) != NGX_OK) { |
523 return NGX_AGAIN; | 525 return NGX_AGAIN; |
524 | 526 |
525 failed: | 527 failed: |
526 | 528 |
527 ngx_rbtree_delete(&r->name_rbtree, &rn->node); | 529 ngx_rbtree_delete(&r->name_rbtree, &rn->node); |
530 | |
531 if (rn->query) { | |
532 ngx_resolver_free(r, rn->query); | |
533 } | |
528 | 534 |
529 ngx_resolver_free(r, rn->name); | 535 ngx_resolver_free(r, rn->name); |
530 | 536 |
531 ngx_resolver_free(r, rn); | 537 ngx_resolver_free(r, rn); |
532 | 538 |
586 } | 592 } |
587 | 593 |
588 ngx_queue_remove(&rn->queue); | 594 ngx_queue_remove(&rn->queue); |
589 | 595 |
590 ngx_resolver_free(r, rn->query); | 596 ngx_resolver_free(r, rn->query); |
597 rn->query = NULL; | |
591 | 598 |
592 } else { | 599 } else { |
593 rn = ngx_resolver_alloc(r, sizeof(ngx_resolver_node_t)); | 600 rn = ngx_resolver_alloc(r, sizeof(ngx_resolver_node_t)); |
594 if (rn == NULL) { | 601 if (rn == NULL) { |
595 goto failed; | 602 goto failed; |
596 } | 603 } |
597 | 604 |
598 rn->node.key = ctx->addr; | 605 rn->node.key = ctx->addr; |
606 rn->query = NULL; | |
599 | 607 |
600 ngx_rbtree_insert(&r->addr_rbtree, &rn->node); | 608 ngx_rbtree_insert(&r->addr_rbtree, &rn->node); |
601 } | 609 } |
602 | 610 |
603 if (ngx_resolver_create_addr_query(rn, ctx) != NGX_OK) { | 611 if (ngx_resolver_create_addr_query(rn, ctx) != NGX_OK) { |
643 | 651 |
644 failed: | 652 failed: |
645 | 653 |
646 if (rn) { | 654 if (rn) { |
647 ngx_rbtree_delete(&r->addr_rbtree, &rn->node); | 655 ngx_rbtree_delete(&r->addr_rbtree, &rn->node); |
656 | |
657 if (rn->query) { | |
658 ngx_resolver_free(r, rn->query); | |
659 } | |
648 | 660 |
649 ngx_resolver_free(r, rn); | 661 ngx_resolver_free(r, rn); |
650 } | 662 } |
651 | 663 |
652 /* unlock addr mutex */ | 664 /* unlock addr mutex */ |