Message ID | 20200826040257.9709-1-nsugino@3way.com.ar |
---|---|
State | New |
Headers | show |
Series | [FFmpeg-devel] avformat/libsrt: Fix epoll fd leak | expand |
Context | Check | Description |
---|---|---|
andriy/default | pending | |
andriy/make | success | Make finished |
andriy/make_fate | success | Make fate finished |
On Wed, 26 Aug 2020, Nicolas Sugino wrote: > Call srt_epoll_release() to avoid fd leak on libsrt_open() error. > --- > libavformat/libsrt.c | 15 +++++++++++++-- > 1 file changed, 13 insertions(+), 2 deletions(-) > > diff --git a/libavformat/libsrt.c b/libavformat/libsrt.c > index 4025b24976..6da372081e 100644 > --- a/libavformat/libsrt.c > +++ b/libavformat/libsrt.c > @@ -380,10 +380,13 @@ static int libsrt_setup(URLContext *h, const char *uri, int flags) > > av_url_split(proto, sizeof(proto), NULL, 0, hostname, sizeof(hostname), > &port, path, sizeof(path), uri); > - if (strcmp(proto, "srt")) > + if (strcmp(proto, "srt")) { > + srt_epoll_release(s->eid); > return AVERROR(EINVAL); > + } > if (port <= 0 || port >= 65536) { > av_log(h, AV_LOG_ERROR, "Port missing in uri\n"); > + srt_epoll_release(s->eid); > return AVERROR(EINVAL); > } > p = strchr(uri, '?'); > @@ -408,6 +411,7 @@ static int libsrt_setup(URLContext *h, const char *uri, int flags) > av_log(h, AV_LOG_ERROR, > "Failed to resolve hostname %s: %s\n", > hostname, gai_strerror(ret)); > + srt_epoll_release(s->eid); > return AVERROR(EIO); > } Move the epoll creation before the restart label instead, this way you will only need the next hunk. > > @@ -495,6 +499,7 @@ static int libsrt_setup(URLContext *h, const char *uri, int flags) > if (listen_fd >= 0) > srt_close(listen_fd); > freeaddrinfo(ai); > + srt_epoll_release(s->eid); > return ret; > } > > @@ -632,10 +637,16 @@ static int libsrt_open(URLContext *h, const char *uri, int flags) > s->linger = strtol(buf, NULL, 10); > } > } > - return libsrt_setup(h, uri, flags); > + ret = libsrt_setup(h, uri, flags); > + if (ret) { > + goto err; > + } if (ret < 0) goto err; > + return 0; > + > err: > av_freep(&s->smoother); > av_freep(&s->streamid); > + srt_cleanup(); > return ret; > } There seems to be a rouge return when parsing "mode", can you fix that as well? Thanks, Marton
diff --git a/libavformat/libsrt.c b/libavformat/libsrt.c index 4025b24976..6da372081e 100644 --- a/libavformat/libsrt.c +++ b/libavformat/libsrt.c @@ -380,10 +380,13 @@ static int libsrt_setup(URLContext *h, const char *uri, int flags) av_url_split(proto, sizeof(proto), NULL, 0, hostname, sizeof(hostname), &port, path, sizeof(path), uri); - if (strcmp(proto, "srt")) + if (strcmp(proto, "srt")) { + srt_epoll_release(s->eid); return AVERROR(EINVAL); + } if (port <= 0 || port >= 65536) { av_log(h, AV_LOG_ERROR, "Port missing in uri\n"); + srt_epoll_release(s->eid); return AVERROR(EINVAL); } p = strchr(uri, '?'); @@ -408,6 +411,7 @@ static int libsrt_setup(URLContext *h, const char *uri, int flags) av_log(h, AV_LOG_ERROR, "Failed to resolve hostname %s: %s\n", hostname, gai_strerror(ret)); + srt_epoll_release(s->eid); return AVERROR(EIO); } @@ -495,6 +499,7 @@ static int libsrt_setup(URLContext *h, const char *uri, int flags) if (listen_fd >= 0) srt_close(listen_fd); freeaddrinfo(ai); + srt_epoll_release(s->eid); return ret; } @@ -632,10 +637,16 @@ static int libsrt_open(URLContext *h, const char *uri, int flags) s->linger = strtol(buf, NULL, 10); } } - return libsrt_setup(h, uri, flags); + ret = libsrt_setup(h, uri, flags); + if (ret) { + goto err; + } + return 0; + err: av_freep(&s->smoother); av_freep(&s->streamid); + srt_cleanup(); return ret; }