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-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d3b577a9ed112e90c5a96e5c7a26983b9cc91fd9;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 65feef2c5..79eb53e1d 100644 --- a/src/httpc.c +++ b/src/httpc.c @@ -687,15 +687,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); @@ -723,8 +717,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); } @@ -1149,9 +1142,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);