From d58fd1231a796b75c72e3751c98d7ae1fc1d946f Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Thu, 22 Feb 2018 23:04:12 +0100 Subject: [PATCH] httpc: fix the improper http_client_finish() call for RTP data state, fixes #4964 --- src/httpc.c | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/httpc.c b/src/httpc.c index b776e0158..49674d4ae 100644 --- a/src/httpc.c +++ b/src/httpc.c @@ -698,15 +698,9 @@ http_client_finish( http_client_t *hc ) tvhtrace(LS_HTTPC, "%04X: finishing", shortid(hc)); - if (hc->hc_in_rtp_data && hc->hc_rtp_data_complete) { - http_client_get(hc); - pthread_mutex_unlock(&hc->hc_mutex); - res = hc->hc_rtp_data_complete(hc); - pthread_mutex_lock(&hc->hc_mutex); - http_client_put(hc); - if (res < 0) - return http_client_flush(hc, res); - } else if (hc->hc_data_complete) { + assert(!hc->hc_in_rtp_data); + + if (hc->hc_data_complete) { http_client_get(hc); pthread_mutex_unlock(&hc->hc_mutex); res = hc->hc_data_complete(hc); @@ -734,8 +728,7 @@ http_client_finish( http_client_t *hc ) return HTTP_CON_RECEIVING; } } - if (TAILQ_FIRST(&hc->hc_wqueue) && hc->hc_code == HTTP_STATUS_OK && - !hc->hc_in_rtp_data) { + if (TAILQ_FIRST(&hc->hc_wqueue) && hc->hc_code == HTTP_STATUS_OK) { hc->hc_code = 0; return http_client_send_partial(hc); } @@ -1160,9 +1153,14 @@ rtsp_data: return res; } r += hc->hc_csize; - hc->hc_in_rtp_data = 1; hc->hc_code = 0; - res = http_client_finish(hc); + if (hc->hc_rtp_data_complete) { + http_client_get(hc); + pthread_mutex_unlock(&hc->hc_mutex); + res = hc->hc_rtp_data_complete(hc); + pthread_mutex_lock(&hc->hc_mutex); + http_client_put(hc); + } hc->hc_in_rtp_data = 0; if (res < 0) return http_client_flush(hc, res); -- 2.47.2