Mercurial > hg > nginx
comparison src/http/ngx_http_core_module.c @ 8104:4cc2bfeff46c
Filtering duplicate addresses in listen (ticket #2400).
Due to the glibc bug[1], getaddrinfo("localhost") with AI_ADDRCONFIG
on a typical host with glibc and without IPv6 returns two 127.0.0.1
addresses, and therefore "listen localhost:80;" used to result in
"duplicate ... address and port pair" after 4f9b72a229c1.
Fix is to explicitly filter out duplicate addresses returned during
resolution of a name.
[1] https://sourceware.org/bugzilla/show_bug.cgi?id=14969
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Wed, 23 Nov 2022 17:30:08 +0300 |
parents | 711737177b77 |
children | 2af1287d2da7 91ad1abfb285 |
comparison
equal
deleted
inserted
replaced
8103:b809f53d3f5b | 8104:4cc2bfeff46c |
---|---|
3961 { | 3961 { |
3962 ngx_http_core_srv_conf_t *cscf = conf; | 3962 ngx_http_core_srv_conf_t *cscf = conf; |
3963 | 3963 |
3964 ngx_str_t *value, size; | 3964 ngx_str_t *value, size; |
3965 ngx_url_t u; | 3965 ngx_url_t u; |
3966 ngx_uint_t n; | 3966 ngx_uint_t n, i; |
3967 ngx_http_listen_opt_t lsopt; | 3967 ngx_http_listen_opt_t lsopt; |
3968 | 3968 |
3969 cscf->listen = 1; | 3969 cscf->listen = 1; |
3970 | 3970 |
3971 value = cf->args->elts; | 3971 value = cf->args->elts; |
4287 "invalid parameter \"%V\"", &value[n]); | 4287 "invalid parameter \"%V\"", &value[n]); |
4288 return NGX_CONF_ERROR; | 4288 return NGX_CONF_ERROR; |
4289 } | 4289 } |
4290 | 4290 |
4291 for (n = 0; n < u.naddrs; n++) { | 4291 for (n = 0; n < u.naddrs; n++) { |
4292 | |
4293 for (i = 0; i < n; i++) { | |
4294 if (ngx_cmp_sockaddr(u.addrs[n].sockaddr, u.addrs[n].socklen, | |
4295 u.addrs[i].sockaddr, u.addrs[i].socklen, 0) | |
4296 == NGX_OK) | |
4297 { | |
4298 goto next; | |
4299 } | |
4300 } | |
4301 | |
4292 lsopt.sockaddr = u.addrs[n].sockaddr; | 4302 lsopt.sockaddr = u.addrs[n].sockaddr; |
4293 lsopt.socklen = u.addrs[n].socklen; | 4303 lsopt.socklen = u.addrs[n].socklen; |
4294 lsopt.addr_text = u.addrs[n].name; | 4304 lsopt.addr_text = u.addrs[n].name; |
4295 lsopt.wildcard = ngx_inet_wildcard(lsopt.sockaddr); | 4305 lsopt.wildcard = ngx_inet_wildcard(lsopt.sockaddr); |
4296 | 4306 |
4297 if (ngx_http_add_listen(cf, cscf, &lsopt) != NGX_OK) { | 4307 if (ngx_http_add_listen(cf, cscf, &lsopt) != NGX_OK) { |
4298 return NGX_CONF_ERROR; | 4308 return NGX_CONF_ERROR; |
4299 } | 4309 } |
4310 | |
4311 next: | |
4312 continue; | |
4300 } | 4313 } |
4301 | 4314 |
4302 return NGX_CONF_OK; | 4315 return NGX_CONF_OK; |
4303 } | 4316 } |
4304 | 4317 |