[vlc-commits] https: validate that content range is what we want

Rémi Denis-Courmont git at videolan.org
Thu Dec 17 21:14:16 CET 2015


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Thu Dec 17 22:13:21 2015 +0200| [6558f6e8d45a8c04477ec2cd38a267375a7c54c4] | committer: Rémi Denis-Courmont

https: validate that content range is what we want

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=6558f6e8d45a8c04477ec2cd38a267375a7c54c4
---

 modules/access/http/file.c |   32 +++++++++++++++++++++++++++-----
 1 file changed, 27 insertions(+), 5 deletions(-)

diff --git a/modules/access/http/file.c b/modules/access/http/file.c
index b9fad18..ee25c4a 100644
--- a/modules/access/http/file.c
+++ b/modules/access/http/file.c
@@ -22,6 +22,8 @@
 # include <config.h>
 #endif
 
+#include <assert.h>
+#include <errno.h>
 #include <stdbool.h>
 #include <stdint.h>
 #include <stdio.h>
@@ -129,11 +131,32 @@ static struct vlc_http_msg *vlc_http_file_open(struct vlc_http_file *file,
 
     int status = vlc_http_msg_get_status(resp);
     if (status < 200 || status >= 599)
+        goto fail;
+
+    if (status == 206)
     {
-        vlc_http_msg_destroy(resp);
-        resp = NULL;
+        const char *str = vlc_http_msg_get_header(resp, "Content-Range");
+        if (str == NULL)
+        {   /* A multipart/byteranges response. This is not what we asked for
+             * and we do not support it. */
+            errno = EINVAL;
+            goto fail;
+        }
+
+        uintmax_t start, end;
+        if (sscanf(str, "bytes %ju-%ju", &start, &end) != 2
+         || start != offset || start > end)
+        {   /* A single range response is what we asked for, but not at that
+             * start offset. */
+            errno = EINVAL;
+            goto fail;
+        }
     }
+
     return resp;
+fail:
+    vlc_http_msg_destroy(resp);
+    return NULL;
 }
 
 void vlc_http_file_destroy(struct vlc_http_file *file)
@@ -273,8 +296,7 @@ uintmax_t vlc_http_file_get_size(struct vlc_http_file *file)
 
     if (status == 206 /* Partial Content */)
     {   /* IETF RFC7233 §4.1 */
-        if (range == NULL)
-            return -1; /* invalid response */
+        assert(range != NULL); /* checked by vlc_http_file_open() */
 
         uintmax_t end, total;
 
@@ -287,7 +309,7 @@ uintmax_t vlc_http_file_get_size(struct vlc_http_file *file)
             case 2:
                 return total;
         }
-        return -1;
+        vlc_assert_unreachable(); /* checked by vlc_http_file_open() */
     }
 
     if (status == 416 /* Range Not Satisfiable */)



More information about the vlc-commits mailing list