Skip to content

Commit 3b6c017

Browse files
author
mdounin
committed
Resolver: protection from duplicate responses.
If we already had CNAME in resolver node (i.e. rn->cnlen and rn->u.cname set), and got additional response with A record, it resulted in rn->cnlen set and rn->u.cname overwritten by rn->u.addr (or rn->u.addrs), causing segmentation fault later in ngx_resolver_free_node() on an attempt to free overwritten rn->u.cname. The opposite (i.e. CNAME got after A) might cause similar problems as well. git-svn-id: svn://svn.nginx.org/nginx/trunk@4620 73f98a42-aea0-e011-b76d-00259023448c
1 parent cc2a7fb commit 3b6c017

File tree

1 file changed

+10
-2
lines changed

1 file changed

+10
-2
lines changed

Diff for: src/core/ngx_resolver.c

+10-2
Original file line numberDiff line numberDiff line change
@@ -513,8 +513,10 @@ ngx_resolve_name_locked(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx)
513513

514514
/* lock alloc mutex */
515515

516-
ngx_resolver_free_locked(r, rn->query);
517-
rn->query = NULL;
516+
if (rn->query) {
517+
ngx_resolver_free_locked(r, rn->query);
518+
rn->query = NULL;
519+
}
518520

519521
if (rn->cnlen) {
520522
ngx_resolver_free_locked(r, rn->u.cname);
@@ -1409,6 +1411,9 @@ ngx_resolver_process_a(ngx_resolver_t *r, u_char *buf, size_t last,
14091411
ngx_resolver_free(r, addrs);
14101412
}
14111413

1414+
ngx_resolver_free(r, rn->query);
1415+
rn->query = NULL;
1416+
14121417
return;
14131418

14141419
} else if (cname) {
@@ -1441,6 +1446,9 @@ ngx_resolver_process_a(ngx_resolver_t *r, u_char *buf, size_t last,
14411446
(void) ngx_resolve_name_locked(r, ctx);
14421447
}
14431448

1449+
ngx_resolver_free(r, rn->query);
1450+
rn->query = NULL;
1451+
14441452
return;
14451453
}
14461454

0 commit comments

Comments
 (0)