From 7abc9b640ad36adbae1e6d72f4395e4790fa3707 Mon Sep 17 00:00:00 2001 From: pyw Date: Sat, 28 Aug 2021 08:56:20 +0800 Subject: [PATCH] SRT: fix srt stream play map error (#1890) * fix url_sz memory out of bounds * fix srt play map error Co-authored-by: pengyouwei --- trunk/src/srt/srt_handle.cpp | 9 ++++----- trunk/src/srt/srt_to_rtmp.cpp | 25 +++++++++++++++++-------- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/trunk/src/srt/srt_handle.cpp b/trunk/src/srt/srt_handle.cpp index bee5dc08f..296b4e4a0 100644 --- a/trunk/src/srt/srt_handle.cpp +++ b/trunk/src/srt/srt_handle.cpp @@ -97,14 +97,13 @@ void srt_handle::close_pull_conn(SRTSOCKET srtsocket, std::string stream_id) { auto streamid_iter = _streamid_map.find(stream_id); if (streamid_iter != _streamid_map.end()) { - auto srtsocket_map = streamid_iter->second; - if (srtsocket_map.size() == 0) { + if (streamid_iter->second.size() == 0) { _streamid_map.erase(stream_id); - } else if (srtsocket_map.size() == 1) { - srtsocket_map.erase(srtsocket); + } else if (streamid_iter->second.size() == 1) { + streamid_iter->second.erase(srtsocket); _streamid_map.erase(stream_id); } else { - srtsocket_map.erase(srtsocket); + streamid_iter->second.erase(srtsocket); } } else { assert(0); diff --git a/trunk/src/srt/srt_to_rtmp.cpp b/trunk/src/srt/srt_to_rtmp.cpp index 525239166..55e09b02b 100644 --- a/trunk/src/srt/srt_to_rtmp.cpp +++ b/trunk/src/srt/srt_to_rtmp.cpp @@ -15,6 +15,7 @@ #include #include #include +#include std::shared_ptr srt2rtmp::s_srt2rtmp_ptr; @@ -258,7 +259,7 @@ rtmp_client::rtmp_client(std::string key_path):_key_path(key_path) _appname = ret_vec[0]; _streamname = ret_vec[1]; } - char url_sz[128]; + std::stringstream url_ss; std::vector ip_ports = _srs_config->get_listens(); int port = 0; @@ -272,21 +273,29 @@ rtmp_client::rtmp_client(std::string key_path):_key_path(key_path) } port = (port == 0) ? 1935 : port; if (_vhost == DEF_VHOST) { - sprintf(url_sz, "rtmp://127.0.0.1:%d/%s/%s", port, - _appname.c_str(), _streamname.c_str()); + url_ss << "rtmp://127.0.0.1:" << port + << "/" << _appname + << "/" << _streamname; } else { - sprintf(url_sz, "rtmp://127.0.0.1:%d/%s?vhost=%s/%s", port, - _appname.c_str(), _vhost.c_str(), _streamname.c_str()); + if (_appname.find("?") == std::string::npos) { + url_ss << "rtmp://127.0.0.1:" << port + << "/" << _appname << "?vhost=" << _vhost + << "/" << _streamname; + } else { + url_ss << "rtmp://127.0.0.1:" << port + << "/" << _appname << "&vhost=" << _vhost + << "/" << _streamname; + } } - - _url = url_sz; + + _url = url_ss.str(); _h264_sps_changed = false; _h264_pps_changed = false; _h264_sps_pps_sent = false; _last_live_ts = now_ms(); - srs_trace("rtmp client construct url:%s", url_sz); + srs_trace("rtmp client construct url:%s", url_ss.str().c_str()); } rtmp_client::~rtmp_client() {