]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
httpc: fix the improper http_client_finish() call for RTP data state, fixes #4964
authorJaroslav Kysela <perex@perex.cz>
Thu, 22 Feb 2018 22:04:12 +0000 (23:04 +0100)
committerJaroslav Kysela <perex@perex.cz>
Fri, 23 Feb 2018 07:01:00 +0000 (08:01 +0100)
src/httpc.c

index b776e015831e04b7da82ad95cd9250dbb8e27a9e..49674d4aebf1fba703a9715c5813ea5a3de4a7a4 100644 (file)
@@ -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);