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); > + } > } > } >
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel