Closed superxrb closed 6 years ago
我没看出这段代码哪里有问题,能描述的再详细一点吗
++cacfp后,再取cacfp[n]的值,会出现未定义情况。
你描述的是个可复现的case吗?
/* match application to find out app conf */
cacfp = hn->service->applications.elts;
for(n = 0; n < hn->service->applications.nelts; ++n, ++cacfp) {
if (cacfp[n]->name.len == s->app.len &&
ngx_strncmp(cacfp[n]->name.data, s->app.data, s->app.len) == 0)
{
/* found app! */
s->app_conf = cacfp[n]->app_conf;
break;
}
}
// n在循环内部是不会超过数组长度的, 所以cacfp[n]不会越界。
// 而在这个循环后面, 如果没找到任何的app, n会等于数组长度, 但之后是不会去取cacfp[n], 所以也不会越界。
可以复现啊,每次循环都++cacfp后,cacfp[n]等于原来的cacfp[2n],会越界。复现方法是:
rtmp {
server {
listen 1935;
service cctv {
hostname pub rtmp .pub.rtmp.cctv;
hostname sub rtmp .sub.rtmp.cctv;
hostname sub http_flv .sub.httpflv.cctv;
application bcflv {
notify_method get;
play /mnt/app/www/;
#on_play http://112.74.193.157:8088/;
}
application bcs {
notify_method get;
play /mnt/app/www/;
#on_play http://112.74.193.157:8088/;
}
}
}
}
在播放第二个application bcs的时候,必然会死机。
谢谢你,我已经复现并修复了问题。
应该将++cacfp去掉,否则可能造成内存越界死机。