[FFmpeg-devel] [PATCH] lavf/dashenc: Fix file URI handling when deleting files.

Jeyapal, Karthick kjeyapal at akamai.com
Wed Nov 28 18:47:56 EET 2018


On 11/28/18 4:46 PM, Andrey Semashev wrote:
> The URI used to open the output streams may be an actual URI with "file" scheme,
> according to https://tools.ietf.org/html/rfc8089. This commit makes file
> deletion routine recognize file URIs and extract the actual filesystem path
> from it.
There is already some code in ffmpeg to handle this. It is present in file_delete() function in file.c.
We will need to avoid code duplication for the same functionality. One option could be to call avpriv_io_delete() function instead of calling unlink, so that file_delete function gets called.
Calling avpriv_io_delete will also make the delete functionality easily extendable for other output protocols. 
>
> It also fixes strerror use, which may not be thread-safe.
> ---
>  libavformat/dashenc.c | 29 +++++++++++++++++++++++++++--
>  1 file changed, 27 insertions(+), 2 deletions(-)
>
> diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c
> index 6ce70e0076..e59fa0944e 100644
> --- a/libavformat/dashenc.c
> +++ b/libavformat/dashenc.c
> @@ -25,6 +25,7 @@
>  #include <unistd.h>
>  #endif
>  
> +#include "libavutil/error.h"
>  #include "libavutil/avassert.h"
>  #include "libavutil/avutil.h"
>  #include "libavutil/avstring.h"
> @@ -1326,8 +1327,32 @@ static void dashenc_delete_file(AVFormatContext *s, char *filename) {
>  
>          av_dict_free(&http_opts);
>          ff_format_io_close(s, &out);
> -    } else if (unlink(filename) < 0) {
> -        av_log(s, AV_LOG_ERROR, "failed to delete %s: %s\n", filename, strerror(errno));
> +    } else {
> +        const char* path = filename;
> +        // Check if the filename is a file URI. https://tools.ietf.org/html/rfc8089#section-2
> +        if (av_strncasecmp(path, "file:", sizeof("file:") - 1) == 0) {
> +            path += sizeof("file:") - 1;
> +            if (path[0] == '/' && path[1] == '/') {
> +                // The URI may have an authority part. Check that the authority does not contain
> +                // a host name. We cannot access filesystem on a different host.
> +                path += 2;
> +                if (path[0] != '/') {
> +                    if (strncmp(path, "localhost", sizeof("localhost") - 1) == 0) {
> +                        path += sizeof("localhost") - 1;
> +                    } else {
> +                        av_log(s, AV_LOG_ERROR, "cannot delete file on a remote host: %s\n", filename);
> +                        return;
> +                    }
> +                }
> +            }
> +        }
> +
> +        if (unlink(path) < 0) {
> +            int err = AVERROR(errno);
> +            char errbuf[128];
> +            av_strerror(err, errbuf, sizeof(errbuf));
> +            av_log(s, (err == AVERROR(ENOENT) ? AV_LOG_WARNING : AV_LOG_ERROR), "failed to delete %s: %s\n", path, errbuf);
> +        }
>      }
>  }
>  



More information about the ffmpeg-devel mailing list