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