From b11ddc7f411171333acead75ebc43b14c920a11b Mon Sep 17 00:00:00 2001 From: winlin Date: Sun, 9 Apr 2017 18:45:42 +0800 Subject: [PATCH] Fix #834, crash for TS context corrupt. 2.0.235 --- README.md | 2 ++ trunk/auto/build_ffmpeg.sh | 2 +- trunk/src/app/srs_app_rtmp_conn.cpp | 8 ++++++++ trunk/src/core/srs_core.hpp | 2 +- trunk/src/kernel/srs_kernel_error.hpp | 2 ++ trunk/src/kernel/srs_kernel_ts.cpp | 12 ++++++++++++ trunk/src/kernel/srs_kernel_ts.hpp | 5 +++++ 7 files changed, 31 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 20183ac47..ed42b3728 100755 --- a/README.md +++ b/README.md @@ -336,6 +336,7 @@ Remark: ## History +* v2.0, 2017-04-09, Fix [#834][bug #834], crash for TS context corrupt. 2.0.235 * v2.0, 2017-03-03, [2.0 release0(2.0.234)][r2.0r0] released. 86373 lines. * v2.0, 2017-02-25, for [#730][bug #730], remove the test code. 2.0.234 * v2.0, 2017-02-09, fix [#503][bug #503] disable utilities when reload a source. 2.0.233 @@ -1279,6 +1280,7 @@ Winlin [bug #750]: https://github.com/ossrs/srs/issues/750 [bug #752]: https://github.com/ossrs/srs/issues/752 [bug #503]: https://github.com/ossrs/srs/issues/503 +[bug #834]: https://github.com/ossrs/srs/issues/834 [bug #xxxxxxxxxx]: https://github.com/ossrs/srs/issues/xxxxxxxxxx [exo #828]: https://github.com/google/ExoPlayer/pull/828 diff --git a/trunk/auto/build_ffmpeg.sh b/trunk/auto/build_ffmpeg.sh index 2bf106508..bb22511f2 100755 --- a/trunk/auto/build_ffmpeg.sh +++ b/trunk/auto/build_ffmpeg.sh @@ -42,7 +42,7 @@ else echo "build fdk-aac-0.1.3" cd $ff_current_dir && rm -rf fdk-aac-0.1.3 && unzip -q ${ff_src_dir}/fdk-aac-0.1.3.zip && - cd fdk-aac-0.1.3 && bash autogen.sh && ./configure --prefix=${ff_release_dir} --enable-static && make ${SRS_JOBS} && make install && + cd fdk-aac-0.1.3 && bash autogen.sh && ./configure --prefix=${ff_release_dir} --enable-static && make ${SRS_JOBS} && make install ret=$?; if [[ 0 -ne ${ret} ]]; then echo "build fdk-aac-0.1.3 failed"; exit 1; fi fi diff --git a/trunk/src/app/srs_app_rtmp_conn.cpp b/trunk/src/app/srs_app_rtmp_conn.cpp index 12a00925e..637b52995 100755 --- a/trunk/src/app/srs_app_rtmp_conn.cpp +++ b/trunk/src/app/srs_app_rtmp_conn.cpp @@ -481,6 +481,14 @@ int SrsRtmpConn::stream_service_cycle() return ret; } srs_info("security check ok"); + + // Never allow the empty stream name, for HLS may write to a file with empty name. + // @see https://github.com/ossrs/srs/issues/834 + if (req->stream.empty()) { + ret = ERROR_RTMP_STREAM_NAME_EMPTY; + srs_error("RTMP: Empty stream name not allowed, ret=%d", ret); + return ret; + } // client is identified, set the timeout to service timeout. rtmp->set_recv_timeout(SRS_CONSTS_RTMP_RECV_TIMEOUT_US); diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp index 8898fbdbc..bbc365bdb 100644 --- a/trunk/src/core/srs_core.hpp +++ b/trunk/src/core/srs_core.hpp @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // current release version #define VERSION_MAJOR 2 #define VERSION_MINOR 0 -#define VERSION_REVISION 234 +#define VERSION_REVISION 235 // generated by configure, only macros. #include diff --git a/trunk/src/kernel/srs_kernel_error.hpp b/trunk/src/kernel/srs_kernel_error.hpp index 15ae8b1ad..aa2cddfc6 100755 --- a/trunk/src/kernel/srs_kernel_error.hpp +++ b/trunk/src/kernel/srs_kernel_error.hpp @@ -152,6 +152,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define ERROR_RTSP_AUDIO_CONFIG 2047 #define ERROR_RTMP_STREAM_NOT_FOUND 2048 #define ERROR_RTMP_CLIENT_NOT_FOUND 2049 +#define ERROR_RTMP_STREAM_NAME_EMPTY 2050 // // system control message, // not an error, but special control logic. @@ -230,6 +231,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define ERROR_RESPONSE_CODE 3064 #define ERROR_RESPONSE_DATA 3065 #define ERROR_REQUEST_DATA 3066 +#define ERROR_TS_CONTEXT_NOT_READY 3067 /////////////////////////////////////////////////////// // HTTP/StreamCaster protocol error. diff --git a/trunk/src/kernel/srs_kernel_ts.cpp b/trunk/src/kernel/srs_kernel_ts.cpp index 8335fc2ac..0b3580880 100644 --- a/trunk/src/kernel/srs_kernel_ts.cpp +++ b/trunk/src/kernel/srs_kernel_ts.cpp @@ -199,6 +199,7 @@ ISrsTsHandler::~ISrsTsHandler() SrsTsContext::SrsTsContext() { + ready = false; pure_audio = false; vcodec = SrsCodecVideoReserved; acodec = SrsCodecAudioReserved1; @@ -234,6 +235,7 @@ void SrsTsContext::on_pmt_parsed() void SrsTsContext::reset() { + ready = false; vcodec = SrsCodecVideoReserved; acodec = SrsCodecAudioReserved1; } @@ -432,6 +434,9 @@ int SrsTsContext::encode_pat_pmt(SrsFileWriter* writer, int16_t vpid, SrsTsStrea return ret; } } + + // When PAT and PMT are writen, the context is ready now. + ready = true; return ret; } @@ -439,6 +444,13 @@ int SrsTsContext::encode_pat_pmt(SrsFileWriter* writer, int16_t vpid, SrsTsStrea int SrsTsContext::encode_pes(SrsFileWriter* writer, SrsTsMessage* msg, int16_t pid, SrsTsStream sid, bool pure_audio) { int ret = ERROR_SUCCESS; + + // Sometimes, the context is not ready(PAT/PMT write failed), error in this situation. + if (!ready) { + ret = ERROR_TS_CONTEXT_NOT_READY; + srs_error("TS: context not ready, ret=%d", ret); + return ret; + } if (msg->payload->length() == 0) { return ret; diff --git a/trunk/src/kernel/srs_kernel_ts.hpp b/trunk/src/kernel/srs_kernel_ts.hpp index 9af8bb0c9..ec7c9bf54 100644 --- a/trunk/src/kernel/srs_kernel_ts.hpp +++ b/trunk/src/kernel/srs_kernel_ts.hpp @@ -346,6 +346,11 @@ public: */ class SrsTsContext { +private: + // Whether context is ready, failed if try to write data when not ready. + // When PAT and PMT writen, the context is ready. + // @see https://github.com/ossrs/srs/issues/834 + bool ready; // codec private: std::map pids;