summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruiquan.crq <caihaoning83@gmail.com>2020-10-17 23:17:14 +0800
committerMarton Balint <cus@passwd.hu>2020-10-28 21:34:09 +0100
commitae9a1a96982669926a4ecb92b066814f5f27dc38 (patch)
treea525e83480275d1dcdca207cdb24f7f3c4d6434c
parent37d742b607d47122d23d548ffd7ad9b09cbc5298 (diff)
lavf/url: fix relative url parsing when the query string or fragment has a colon
This disallows the usage of ? and # in libavformat specific scheme options (e.g. subfile,,start,32815239,end,0,,:video.ts) but this change was considered acceptable. Signed-off-by: ruiquan.crq <caihaoning83@gmail.com> Signed-off-by: Marton Balint <cus@passwd.hu>
-rw-r--r--libavformat/tests/url.c2
-rw-r--r--libavformat/url.c2
-rw-r--r--tests/ref/fate/url8
3 files changed, 11 insertions, 1 deletions
diff --git a/libavformat/tests/url.c b/libavformat/tests/url.c
index 2440ae08bc..2eb597bb5e 100644
--- a/libavformat/tests/url.c
+++ b/libavformat/tests/url.c
@@ -90,6 +90,8 @@ int main(void)
test_decompose("http://[::1]/dev/null");
test_decompose("http://[::1]:8080/dev/null");
test_decompose("//ffmpeg/dev/null");
+ test_decompose("test?url=http://server/path");
+ test_decompose("dummy.mp4#t=0:02:00,121.5");
printf("Testing ff_make_absolute_url:\n");
test(NULL, "baz");
diff --git a/libavformat/url.c b/libavformat/url.c
index 3c858f0257..6db4b4e1ae 100644
--- a/libavformat/url.c
+++ b/libavformat/url.c
@@ -97,7 +97,7 @@ int ff_url_decompose(URLComponents *uc, const char *url, const char *end)
/* scheme */
uc->scheme = cur;
- p = find_delim(":/", cur, end); /* lavf "schemes" can contain options */
+ p = find_delim(":/?#", cur, end); /* lavf "schemes" can contain options but not some RFC 3986 delimiters */
if (*p == ':')
cur = p + 1;
diff --git a/tests/ref/fate/url b/tests/ref/fate/url
index 7e6395c47b..08e80def7d 100644
--- a/tests/ref/fate/url
+++ b/tests/ref/fate/url
@@ -43,6 +43,14 @@ http://[::1]:8080/dev/null =>
host: ffmpeg
path: /dev/null
+test?url=http://server/path =>
+ path: test
+ query: ?url=http://server/path
+
+dummy.mp4#t=0:02:00,121.5 =>
+ path: dummy.mp4
+ fragment: #t=0:02:00,121.5
+
Testing ff_make_absolute_url:
(null) baz => baz
/foo/bar baz => /foo/baz