From: Jaroslav Kysela Date: Mon, 30 Oct 2017 11:45:47 +0000 (+0100) Subject: httpc: introduce http_client_rbuf_cut(), try to fix wrong rbuf update for RTP data... X-Git-Tag: v4.2.5~39 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dba9dd3f7aa1c790e7fa299d0b060b0e5554c040;p=thirdparty%2Ftvheadend.git httpc: introduce http_client_rbuf_cut(), try to fix wrong rbuf update for RTP data, issue #4353 --- diff --git a/src/httpc.c b/src/httpc.c index 8427ceeb2..4bc2dbbc3 100644 --- a/src/httpc.c +++ b/src/httpc.c @@ -241,6 +241,14 @@ http_client_direction ( http_client_t *hc, int sending ) * Main I/O routines */ +static inline void +http_client_rbuf_cut( http_client_t *hc, size_t cut ) +{ + size_t len = hc->hc_rpos - cut; + memmove(hc->hc_rbuf, hc->hc_rbuf + cut, len); + hc->hc_rpos = len; +} + static void http_client_cmd_destroy( http_client_t *hc, http_client_wcmd_t *cmd ) { @@ -1100,23 +1108,21 @@ header: if (res < 0) return http_client_flush(hc, res); } - len = hc->hc_rpos - hc->hc_hsize; - hc->hc_rpos = 0; if (hc->hc_code == HTTP_STATUS_CONTINUE) { - memmove(hc->hc_rbuf, hc->hc_rbuf + hc->hc_hsize, len); - hc->hc_rpos = len; + http_client_rbuf_cut(hc, hc->hc_hsize); goto next_header; } if (hc->hc_version == RTSP_VERSION_1_0 && (hc->hc_csize == -1 || !hc->hc_csize)) { hc->hc_csize = -1; hc->hc_in_data = 0; - memmove(hc->hc_rbuf, hc->hc_rbuf + hc->hc_hsize, len); - hc->hc_rpos = len; + http_client_rbuf_cut(hc, hc->hc_hsize); return http_client_finish(hc); } else { hc->hc_in_data = 1; } + len = hc->hc_rpos - hc->hc_hsize; + hc->hc_rpos = 0; res = http_client_data_received(hc, hc->hc_rbuf + hc->hc_hsize, len, 1); if (res < 0) return http_client_flush(hc, res); @@ -1127,15 +1133,15 @@ header: rtsp_data: /* RTSP embedded data */ r = 0; - res = HTTP_CON_RECEIVING; hc->hc_in_data = 0; hc->hc_in_rtp_data = 0; while (hc->hc_rpos > r + 3) { + if (hc->hc_rbuf[r] != '$') + break; hc->hc_csize = 4 + ((hc->hc_rbuf[r+2] << 8) | hc->hc_rbuf[r+3]); hc->hc_chunked = 0; if (r + hc->hc_csize > hc->hc_rpos) { - memmove(hc->hc_rbuf, hc->hc_rbuf + r, hc->hc_rpos - r); - hc->hc_rpos -= r; + http_client_rbuf_cut(hc, r); hc->hc_in_rtp_data = 1; if (r == 0) goto retry; @@ -1149,8 +1155,6 @@ rtsp_data: http_client_put(hc); if (res < 0) return res; - } else { - res = 0; } r += hc->hc_csize; hc->hc_in_rtp_data = 1; @@ -1159,14 +1163,12 @@ rtsp_data: hc->hc_in_rtp_data = 0; if (res < 0) return http_client_flush(hc, res); - res = HTTP_CON_RECEIVING; - if (hc->hc_rpos < r + 4 || hc->hc_rbuf[r] != '$') { - memmove(hc->hc_rbuf, hc->hc_rbuf + r, hc->hc_rpos - r); - hc->hc_rpos -= r; - goto next_header; - } } - return res; + if (r > 0) { + http_client_rbuf_cut(hc, r); + goto next_header; + } + return HTTP_CON_RECEIVING; } int