1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

refine fast buffer, check available bytes to read.

This commit is contained in:
winlin 2014-12-04 22:10:05 +08:00
parent 98647d6e67
commit 4c6cf959c1
2 changed files with 18 additions and 19 deletions

View file

@ -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_PACKET_INVALID 1019
#define ERROR_SYSTEM_CLIENT_INVALID 1020 #define ERROR_SYSTEM_CLIENT_INVALID 1020
#define ERROR_SYSTEM_ASSERT_FAILED 1021 #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_INVALID 1023
#define ERROR_SYSTEM_CONFIG_DIRECTIVE 1024 #define ERROR_SYSTEM_CONFIG_DIRECTIVE 1024
#define ERROR_SYSTEM_CONFIG_BLOCK_START 1025 #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_OpenSslSha256DigestSize 2037
#define ERROR_OpenSslGetPeerPublicKey 2038 #define ERROR_OpenSslGetPeerPublicKey 2038
#define ERROR_OpenSslComputeSharedKey 2039 #define ERROR_OpenSslComputeSharedKey 2039
#define ERROR_RTMP_BUFFER_OVERFLOW 2040
// //
// system control message, // system control message,
// not an error, but special control logic. // not an error, but special control logic.

View file

@ -169,18 +169,18 @@ int SrsFastBuffer::grow(ISrsBufferReader* reader, int required_size)
{ {
int ret = ERROR_SUCCESS; int ret = ERROR_SUCCESS;
if (required_size < 0) { // generally the required size is ok.
ret = ERROR_SYSTEM_SIZE_NEGATIVE; if (end - p >= required_size) {
srs_error("size is negative. size=%d, ret=%d", required_size, ret);
return ret; return ret;
} }
// when read payload and need to grow, reset buffer. // must be positive.
// or there is no space to read. 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; int max_to_read = buffer + nb_buffer - end;
if (end - p < required_size if (required_size > SRS_RTMP_MAX_MESSAGE_HEADER || max_to_read < required_size) {
&& (required_size > SRS_RTMP_MAX_MESSAGE_HEADER || max_to_read < required_size)
) {
int nb_cap = end - p; int nb_cap = end - p;
srs_verbose("move fast buffer %d bytes", nb_cap); srs_verbose("move fast buffer %d bytes", nb_cap);
if (nb_cap < nb_buffer) { if (nb_cap < nb_buffer) {
@ -190,16 +190,16 @@ int SrsFastBuffer::grow(ISrsBufferReader* reader, int required_size)
} }
} }
while (end - p < required_size) { // directly check the available bytes to read in buffer.
// the max to read is the left bytes.
max_to_read = buffer + nb_buffer - end; max_to_read = buffer + nb_buffer - end;
if (max_to_read < required_size) {
if (max_to_read <= 0) { ret = ERROR_READER_BUFFER_OVERFLOW;
ret = ERROR_RTMP_BUFFER_OVERFLOW;
srs_error("buffer overflow, required=%d, max=%d, ret=%d", required_size, nb_buffer, ret); srs_error("buffer overflow, required=%d, max=%d, ret=%d", required_size, nb_buffer, ret);
return ret; return ret;
} }
// buffer is ok, read required size of bytes.
while (end - p < required_size) {
ssize_t nread; ssize_t nread;
if ((ret = reader->read(end, max_to_read, &nread)) != ERROR_SUCCESS) { if ((ret = reader->read(end, max_to_read, &nread)) != ERROR_SUCCESS) {
return ret; return ret;