tengine --with-stream_sni and listen ipv6 address core dump

q35jwt9p  于 4个月前  发布在  其他
关注(0)|答案(1)|浏览(40)

Ⅰ. Issue Description

在编译tengine时加上参数--with-stream_sni,在配置文件中,stream块里监听一个ipv6地址,在访问这个ipv6时出现core dump

tengine版本:2.3.2
配置:
stream {
server {
listen [::]:7780;
}
}

qlzsbp2j

qlzsbp2j1#

问题原因:
在解析配置文件时,执行ngx_stream_optimize_servers函数,其中会根据listen socket的sa_family来决定是调用ngx_stream_add_addrs6函数还是ngx_stream_add_addrs函数;

在ngx_stream_add_addrs函数中:有这样两行
#if (NGX_STREAM_SNI)
addrs[i].conf.default_server = addr[i].default_server;
而在ngx_stream_add_addrs6函数中没有
addrs6[i].conf.default_server = addr[i].default_server;

也就是说对于监听的ipv6地址,并没有给其conf.default_server赋值
因此在请求到来时,调用listen socket的回调函数ngx_stream_init_connection,在该函数中执行到
#if (NGX_STREAM_SNI)
s->addr_conf = addr_conf;
s->main_conf = ((ngx_stream_core_srv_conf_t*)addr_conf->default_server)->ctx->main_conf;
s->srv_conf = ((ngx_stream_core_srv_conf_t*)addr_conf->default_server)->ctx->srv_conf;
时就会出现core dump

解决办法:
在ngx_stream_add_addrs6函数中加上addrs6[i].conf.default_server = addr[i].default_server;
即可解决上述问题

相关问题