Message ID | 20210405232456.6367-1-cus@passwd.hu |
---|---|
State | Accepted |
Commit | 5dc5f289cefe67457bd16f1950c56911e926385f |
Headers | show |
Series | [FFmpeg-devel,1/2] avformat/url: fix ff_make_absolute_url with Windows file paths | expand |
Context | Check | Description |
---|---|---|
andriy/x86_make | success | Make finished |
andriy/x86_make_fate | success | Make fate finished |
andriy/PPC64_make | success | Make finished |
andriy/PPC64_make_fate | success | Make fate finished |
On Tue, 6 Apr 2021, Marton Balint wrote: > Ugly, but a lot less broken than it was. > > Fixes ticket #9166. Ok, it seems there were no interest, so I just applied the series, so maybe this can make it into 4.4 as well. Regards, Marton > > Signed-off-by: Marton Balint <cus@passwd.hu> > --- > libavformat/url.c | 24 +++++++++++++++++++++++- > 1 file changed, 23 insertions(+), 1 deletion(-) > > 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) > -- > 2.26.2 > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
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)
Ugly, but a lot less broken than it was. Fixes ticket #9166. Signed-off-by: Marton Balint <cus@passwd.hu> --- libavformat/url.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-)