gnolizuh / BLSS

NGINX-based Live Media Streaming Server
Other
196 stars 73 forks source link

ngx_rtmp_cmd_module.c第141行有问题,在多个play的情况下有可能造成进程死机。 #89

Closed superxrb closed 6 years ago

superxrb commented 6 years ago

应该将++cacfp去掉,否则可能造成内存越界死机。

gnolizuh commented 6 years ago

我没看出这段代码哪里有问题,能描述的再详细一点吗

superxrb commented 6 years ago

++cacfp后,再取cacfp[n]的值,会出现未定义情况。

gnolizuh commented 6 years ago

你描述的是个可复现的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], 所以也不会越界。
superxrb commented 6 years ago

可以复现啊,每次循环都++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的时候,必然会死机。

gnolizuh commented 6 years ago

谢谢你,我已经复现并修复了问题。