Generally, this seems to be too complicated with too much of copying.

On Mon, Jul 27, 2020 at 3:08 PM Steven Liu <l...@chinaffmpeg.org> wrote:

> use two buffer for storage the path and node of URI
> remove the last node of the path if the next node is ..
> change the static strings to dynamic alloc space by size argument.
>
> Signed-off-by: Steven Liu <l...@chinaffmpeg.org>
> ---
>  libavformat/url.c | 83 ++++++++++++++++++++++++++++++++++++-----------
>  1 file changed, 64 insertions(+), 19 deletions(-)
>
> diff --git a/libavformat/url.c b/libavformat/url.c
> index 20463a6674..4fb703de78 100644
> --- a/libavformat/url.c
> +++ b/libavformat/url.c
> @@ -82,41 +82,78 @@ static void trim_double_dot_url(char *buf, const char
> *rel, int size)
>  {
>      const char *p = rel;
>      const char *root = rel;
> -    char tmp_path[MAX_URL_SIZE] = {0, };
> +    char *tmp_path = NULL;
> +    char *second_buf = NULL;
> +    char *first_buf = NULL;
>      char *sep;
>      char *node;
>
> +    tmp_path = av_mallocz(size);
> +    if (!tmp_path)
> +        return;
> +
> +    second_buf = av_mallocz(size);
> +    if (!second_buf)
> +        goto fail;
> +
> +    first_buf = av_mallocz(size);
> +    if (!first_buf)
> +        goto fail;
>

Why 3 buffers? 1 would be enough.

+
>      /* Get the path root of the url which start by "://" */
>      if (p && (sep = strstr(p, "://"))) {
>          sep += 3;
>          root = strchr(sep, '/');
>          if (!root)
> -            return;
> +            goto fail;
>      }
> +    av_strlcat(tmp_path, p, root - p + 1);
>
>      /* set new current position if the root node is changed */
>      p = root;
> -    while (p && (node = strstr(p, ".."))) {
> -        av_strlcat(tmp_path, p, node - p + strlen(tmp_path));
> -        p = node + 3;
> -        sep = strrchr(tmp_path, '/');
> +    if (*p == '/')
> +        p++;
> +    while (p && (node = strchr(p, '/'))) {
> +        av_strlcpy(second_buf, p, node - p + 1);
> +        p = node + 1;
> +        if (!strcmp(second_buf, "..")) {
>

If you used if(node - p == 2 && !strncmp(node, "..", 2)) you would not have
to copy to the second buffer.

+            if (strlen(first_buf) <= 0)
> +                continue;
> +            sep = strrchr(first_buf, '/');
> +            if (sep)
> +                sep[0] = '\0';
> +            else
> +                memset(first_buf, 0, size);
> +
> +            memset(second_buf, 0, size);
> +        } else {
> +            av_strlcat(first_buf, "/", size);
> +            av_strlcat(first_buf, second_buf, size);
> +        }
> +    }
> +    if (!strcmp(p, "..")) {
> +        sep = strrchr(first_buf, '/');
>          if (sep)
>              sep[0] = '\0';
>          else
> -            tmp_path[0] = '\0';
> +            memset(first_buf, 0, size);
> +    } else {
> +        av_strlcat(first_buf, "/", size);
> +        av_strlcat(first_buf, p, size);
>      }
>
> -    if (!av_stristart(p, "/", NULL) && root != rel)
> -        av_strlcat(tmp_path, "/", size);
> -
> -    av_strlcat(tmp_path, p, size);
> -    /* start set buf after temp path process. */
> -    av_strlcpy(buf, rel, root - rel + 1);
> -
> -    if (!av_stristart(tmp_path, "/", NULL) && root != rel)
> -        av_strlcat(buf, "/", size);
> +    if (p > root) {
> +        av_strlcat(tmp_path, first_buf, size);
> +    } else {
> +        av_strlcat(tmp_path, p, size);
> +    }
>
>      av_strlcat(buf, tmp_path, size);
> +
> +fail:
> +    av_free(second_buf);
> +    av_free(first_buf);
> +    av_free(tmp_path);
>  }
>
>  void ff_make_absolute_url(char *buf, int size, const char *base,
> @@ -124,9 +161,11 @@ void ff_make_absolute_url(char *buf, int size, const
> char *base,
>  {
>      char *sep, *path_query;
>      char *root, *p;
> -    char tmp_path[MAX_URL_SIZE];
> +    char *tmp_path = av_mallocz(size);
> +
> +    if (!tmp_path)
> +        return;
>
> -    memset(tmp_path, 0, sizeof(tmp_path));
>      /* Absolute path, relative to the current server */
>      if (base && strstr(base, "://") && rel[0] == '/') {
>          if (base != buf)
> @@ -148,12 +187,14 @@ void ff_make_absolute_url(char *buf, int size, const
> char *base,
>          trim_double_dot_url(tmp_path, buf, size);
>          memset(buf, 0, size);
>          av_strlcpy(buf, tmp_path, size);
> +        av_free(tmp_path);
>          return;
>      }
>      /* If rel actually is an absolute url, just copy it */
>      if (!base || strstr(rel, "://") || rel[0] == '/') {
>          memset(buf, 0, size);
>          trim_double_dot_url(buf, rel, size);
> +        av_free(tmp_path);
>          return;
>      }
>      if (base != buf)
> @@ -170,6 +211,7 @@ void ff_make_absolute_url(char *buf, int size, const
> char *base,
>          trim_double_dot_url(tmp_path, buf, size);
>          memset(buf, 0, size);
>          av_strlcpy(buf, tmp_path, size);
> +        av_free(tmp_path);
>          return;
>      }
>
> @@ -180,8 +222,10 @@ void ff_make_absolute_url(char *buf, int size, const
> char *base,
>          if (sep) {
>              sep += 3;
>              root = strchr(sep, '/');
> -            if (!root)
> +            if (!root) {
> +                av_free(tmp_path);
>                  return;
> +            }
>          }
>      }
>
> @@ -218,6 +262,7 @@ void ff_make_absolute_url(char *buf, int size, const
> char *base,
>      trim_double_dot_url(tmp_path, buf, size);
>      memset(buf, 0, size);
>      av_strlcpy(buf, tmp_path, size);
> +    av_free(tmp_path);
>  }
>
>  AVIODirEntry *ff_alloc_dir_entry(void)
> --
> 2.25.0
>
>
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".



-- 
Josef Zlomek
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to