summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarton Balint <cus@passwd.hu>2021-04-02 17:07:54 +0200
committerMarton Balint <cus@passwd.hu>2021-04-07 22:14:56 +0200
commit5dc5f289cefe67457bd16f1950c56911e926385f (patch)
tree3c5d06957fb66e511f32146dc9f5d78f05aa0377
parent557953a397dfdd9c7a3d8c2f60d1204599e3d3ac (diff)
avformat/url: fix ff_make_absolute_url with Windows file paths
Ugly, but a lot less broken than it was. Fixes ticket #9166. Signed-off-by: Marton Balint <cus@passwd.hu>
-rw-r--r--libavformat/url.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/libavformat/url.c b/libavformat/url.c
index 77d610d95f..222d7d8a10 100644
--- a/libavformat/url.c
+++ b/libavformat/url.c
@@ -149,6 +149,18 @@ int ff_url_decompose(URLComponents *uc, const char *url, const char *end)
return 0;
}
+static int is_fq_dos_path(const char *path)
+{
+ if ((path[0] >= 'a' && path[0] <= 'z' || path[0] >= 'A' && path[0] <= 'Z') &&
+ path[1] == ':' &&
+ (path[2] == '/' || path[2] == '\\'))
+ return 1;
+ if ((path[0] == '/' || path[0] == '\\') &&
+ (path[1] == '/' || path[1] == '\\'))
+ return 1;
+ return 0;
+}
+
static int append_path(char *root, char *out_end, char **rout,
const char *in, const char *in_end)
{
@@ -185,6 +197,7 @@ int ff_make_absolute_url(char *buf, int size, const char *base,
char *out, *out_end, *path;
const char *keep, *base_path_end;
int use_base_path, simplify_path = 0, ret;
+ const char *base_separators = "/";
/* This is tricky.
For HTTP, http://server/site/page + ../media/file
@@ -211,6 +224,15 @@ int ff_make_absolute_url(char *buf, int size, const char *base,
if (!base)
base = "";
+ if (HAVE_DOS_PATHS) {
+ if ((ret = ff_url_decompose(&ub, base, NULL)) < 0)
+ goto error;
+ if (is_fq_dos_path(base) || av_strstart(base, "file:", NULL) || ub.path == ub.url) {
+ base_separators = "/\\";
+ if (is_fq_dos_path(rel))
+ base = "";
+ }
+ }
if ((ret = ff_url_decompose(&ub, base, NULL)) < 0 ||
(ret = ff_url_decompose(&uc, rel, NULL)) < 0)
goto error;
@@ -249,7 +271,7 @@ int ff_make_absolute_url(char *buf, int size, const char *base,
if (use_base_path) {
base_path_end = ub.url_component_end_path;
if (URL_COMPONENT_HAVE(uc, path))
- while (base_path_end > ub.path && base_path_end[-1] != '/')
+ while (base_path_end > ub.path && !strchr(base_separators, base_path_end[-1]))
base_path_end--;
}
if (keep > ub.path)