summaryrefslogtreecommitdiff
path: root/libavformat
diff options
context:
space:
mode:
authorMarton Balint <cus@passwd.hu>2020-10-09 21:37:07 +0200
committerMarton Balint <cus@passwd.hu>2020-10-16 23:15:09 +0200
commitfb0304fcc9f79a4c9cbdf347f20f484529f169ba (patch)
tree15bdcf6d2df6bf2e2c8c343b6436461a5f6c28f2 /libavformat
parente704750a9f51b4d3fd9a334da75d781e18a9e00c (diff)
avformat/libsrt: fix cleanups on failed libsrt_open() and libsrt_setup()
- 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@3way.com.ar>. Signed-off-by: Marton Balint <cus@passwd.hu>
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/libsrt.c21
1 files 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;
}