[FFmpeg-devel] [PATCH] avformat/libsrt: fix cleanups on failed libsrt_open() and libsrt_setup()

Marton Balint cus at passwd.hu
Sat Oct 17 00:13:00 EEST 2020



On Fri, 9 Oct 2020, Marton Balint wrote:

> - Call srt_epoll_release() to avoid fd leak on libsrt_setup() error.
> - Call srt_cleanup() on libsrt_open() failure.
> - Fix return value and method on mode parsing failure.
>
> Based on a patch by Nicolas Sugino <nsugino at 3way.com.ar>.

Will apply.

Regards,
Marton

>
> Signed-off-by: Marton Balint <cus at passwd.hu>
> ---
> libavformat/libsrt.c | 21 ++++++++++++++-------
> 1 file changed, 14 insertions(+), 7 deletions(-)
>
> diff --git a/libavformat/libsrt.c b/libavformat/libsrt.c
> index 4025b24976..f73e7dbfa5 100644
> --- a/libavformat/libsrt.c
> +++ b/libavformat/libsrt.c
> @@ -373,11 +373,6 @@ static int libsrt_setup(URLContext *h, const char *uri, int flags)
>     int64_t open_timeout = 0;
>     int eid;
> 
> -    eid = srt_epoll_create();
> -    if (eid < 0)
> -        return libsrt_neterrno(h);
> -    s->eid = eid;
> -
>     av_url_split(proto, sizeof(proto), NULL, 0, hostname, sizeof(hostname),
>         &port, path, sizeof(path), uri);
>     if (strcmp(proto, "srt"))
> @@ -413,6 +408,11 @@ static int libsrt_setup(URLContext *h, const char *uri, int flags)
>
>     cur_ai = ai;
> 
> +    eid = srt_epoll_create();
> +    if (eid < 0)
> +        return libsrt_neterrno(h);
> +    s->eid = eid;
> +
>  restart:
>
>     fd = srt_socket(cur_ai->ai_family, cur_ai->ai_socktype, 0);
> @@ -495,6 +495,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;
> }
> 
> @@ -584,7 +585,8 @@ static int libsrt_open(URLContext *h, const char *uri, int flags)
>             } else if (!strcmp(buf, "rendezvous")) {
>                 s->mode = SRT_MODE_RENDEZVOUS;
>             } else {
> -                return AVERROR(EIO);
> +                ret = AVERROR(EINVAL);
> +                goto err;
>             }
>         }
>         if (av_find_info_tag(buf, sizeof(buf), "sndbuf", p)) {
> @@ -632,10 +634,15 @@ 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 < 0)
> +        goto err;
> +    return 0;
> +
> err:
>     av_freep(&s->smoother);
>     av_freep(&s->streamid);
> +    srt_cleanup();
>     return ret;
> }
> 
> -- 
> 2.26.2
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".


More information about the ffmpeg-devel mailing list