From: Jaroslav Kysela Date: Thu, 22 Feb 2018 22:04:12 +0000 (+0100) Subject: httpc: fix the improper http_client_finish() call for RTP data state, fixes #4964 X-Git-Tag: v4.2.6~20 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d58fd1231a796b75c72e3751c98d7ae1fc1d946f;p=thirdparty%2Ftvheadend.git httpc: fix the improper http_client_finish() call for RTP data state, fixes #4964 --- 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);