From 4c6cf959c155221f8e8e6115b43178068da98375 Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 4 Dec 2014 22:10:05 +0800 Subject: [PATCH] refine fast buffer, check available bytes to read. --- trunk/src/kernel/srs_kernel_error.hpp | 3 +-- trunk/src/rtmp/srs_protocol_buffer.cpp | 34 +++++++++++++------------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/trunk/src/kernel/srs_kernel_error.hpp b/trunk/src/kernel/srs_kernel_error.hpp index 75db04faf..51141b107 100644 --- a/trunk/src/kernel/srs_kernel_error.hpp +++ b/trunk/src/kernel/srs_kernel_error.hpp @@ -60,7 +60,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define ERROR_SYSTEM_PACKET_INVALID 1019 #define ERROR_SYSTEM_CLIENT_INVALID 1020 #define ERROR_SYSTEM_ASSERT_FAILED 1021 -#define ERROR_SYSTEM_SIZE_NEGATIVE 1022 +#define ERROR_READER_BUFFER_OVERFLOW 1022 #define ERROR_SYSTEM_CONFIG_INVALID 1023 #define ERROR_SYSTEM_CONFIG_DIRECTIVE 1024 #define ERROR_SYSTEM_CONFIG_BLOCK_START 1025 @@ -134,7 +134,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define ERROR_OpenSslSha256DigestSize 2037 #define ERROR_OpenSslGetPeerPublicKey 2038 #define ERROR_OpenSslComputeSharedKey 2039 -#define ERROR_RTMP_BUFFER_OVERFLOW 2040 // // system control message, // not an error, but special control logic. diff --git a/trunk/src/rtmp/srs_protocol_buffer.cpp b/trunk/src/rtmp/srs_protocol_buffer.cpp index f801380c0..20b9d2be3 100644 --- a/trunk/src/rtmp/srs_protocol_buffer.cpp +++ b/trunk/src/rtmp/srs_protocol_buffer.cpp @@ -169,18 +169,18 @@ int SrsFastBuffer::grow(ISrsBufferReader* reader, int required_size) { int ret = ERROR_SUCCESS; - if (required_size < 0) { - ret = ERROR_SYSTEM_SIZE_NEGATIVE; - srs_error("size is negative. size=%d, ret=%d", required_size, ret); + // generally the required size is ok. + if (end - p >= required_size) { return ret; } - // when read payload and need to grow, reset buffer. - // or there is no space to read. + // must be positive. + srs_assert(required_size > 0); + + // when read payload or there is no space to read, + // reset the buffer with exists bytes. int max_to_read = buffer + nb_buffer - end; - if (end - p < required_size - && (required_size > SRS_RTMP_MAX_MESSAGE_HEADER || max_to_read < required_size) - ) { + if (required_size > SRS_RTMP_MAX_MESSAGE_HEADER || max_to_read < required_size) { int nb_cap = end - p; srs_verbose("move fast buffer %d bytes", nb_cap); if (nb_cap < nb_buffer) { @@ -190,16 +190,16 @@ int SrsFastBuffer::grow(ISrsBufferReader* reader, int required_size) } } + // directly check the available bytes to read in buffer. + max_to_read = buffer + nb_buffer - end; + if (max_to_read < required_size) { + ret = ERROR_READER_BUFFER_OVERFLOW; + srs_error("buffer overflow, required=%d, max=%d, ret=%d", required_size, nb_buffer, ret); + return ret; + } + + // buffer is ok, read required size of bytes. while (end - p < required_size) { - // the max to read is the left bytes. - max_to_read = buffer + nb_buffer - end; - - if (max_to_read <= 0) { - ret = ERROR_RTMP_BUFFER_OVERFLOW; - srs_error("buffer overflow, required=%d, max=%d, ret=%d", required_size, nb_buffer, ret); - return ret; - } - ssize_t nread; if ((ret = reader->read(end, max_to_read, &nread)) != ERROR_SUCCESS) { return ret;