]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
httpc: introduce http_client_rbuf_cut(), try to fix wrong rbuf update for RTP data...
authorJaroslav Kysela <perex@perex.cz>
Mon, 30 Oct 2017 11:45:47 +0000 (12:45 +0100)
committerJaroslav Kysela <perex@perex.cz>
Wed, 1 Nov 2017 08:23:05 +0000 (09:23 +0100)
src/httpc.c

index 8427ceeb2589e993ec945da276c8cf8c24d31930..4bc2dbbc397628ffe10fe4b605db796de064ef0f 100644 (file)
@@ -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