diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c index 3d5469616f..c1c645bee3 100644 --- a/libavformat/rtsp.c +++ b/libavformat/rtsp.c @@ -562,6 +562,20 @@ void rtsp_parse_line(RTSPHeader *reply, const char *buf) } } +static int url_readbuf(URLContext *h, unsigned char *buf, int size) +{ + int ret, len; + + len = 0; + while (len < size) { + ret = url_read(h, buf+len, size-len); + if (ret < 1) + return ret; + len += ret; + } + return len; +} + /* skip a RTP/TCP interleaved packet */ static void rtsp_skip_packet(AVFormatContext *s) { @@ -569,7 +583,7 @@ static void rtsp_skip_packet(AVFormatContext *s) int ret, len, len1; uint8_t buf[1024]; - ret = url_read(rt->rtsp_hd, buf, 3); + ret = url_readbuf(rt->rtsp_hd, buf, 3); if (ret != 3) return; len = (buf[1] << 8) | buf[2]; @@ -581,7 +595,7 @@ static void rtsp_skip_packet(AVFormatContext *s) len1 = len; if (len1 > sizeof(buf)) len1 = sizeof(buf); - ret = url_read(rt->rtsp_hd, buf, len1); + ret = url_readbuf(rt->rtsp_hd, buf, len1); if (ret != len1) return; len -= len1; @@ -621,7 +635,7 @@ static void rtsp_send_cmd(AVFormatContext *s, for(;;) { q = buf; for(;;) { - if (url_read(rt->rtsp_hd, &ch, 1) != 1) + if (url_readbuf(rt->rtsp_hd, &ch, 1) != 1) break; if (ch == '\n') break; @@ -661,7 +675,7 @@ static void rtsp_send_cmd(AVFormatContext *s, if (content_length > 0) { /* leave some room for a trailing '\0' (useful for simple parsing) */ content = av_malloc(content_length + 1); - url_read(rt->rtsp_hd, content, content_length); + (void)url_readbuf(rt->rtsp_hd, content, content_length); content[content_length] = '\0'; } if (content_ptr) @@ -921,7 +935,7 @@ static int tcp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st, #endif redo: for(;;) { - ret = url_read(rt->rtsp_hd, buf, 1); + ret = url_readbuf(rt->rtsp_hd, buf, 1); #ifdef DEBUG_RTP_TCP printf("ret=%d c=%02x [%c]\n", ret, buf[0], buf[0]); #endif @@ -930,7 +944,7 @@ static int tcp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st, if (buf[0] == '$') break; } - ret = url_read(rt->rtsp_hd, buf, 3); + ret = url_readbuf(rt->rtsp_hd, buf, 3); if (ret != 3) return -1; id = buf[0]; @@ -941,7 +955,7 @@ static int tcp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st, if (len > buf_size || len < 12) goto redo; /* get the data */ - ret = url_read(rt->rtsp_hd, buf, len); + ret = url_readbuf(rt->rtsp_hd, buf, len); if (ret != len) return -1;