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 */