diff options
author | Alexander S. Drozdov <adrozdoff@gmail.com> | 2015-09-11 16:31:44 +1000 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2015-09-11 21:44:30 +0200 |
commit | 6a8d58d69309d27402714caeaf92a7270e0f2a84 (patch) | |
tree | 08fc9ae7901205146aefc4a4c9b4474890dfe84d /libavformat/tcp.c | |
parent | f600381b79efde4a278d261753f4cc5dc25d2a46 (diff) | |
download | ffmpeg-6a8d58d69309d27402714caeaf92a7270e0f2a84.tar.gz |
avformat/tcp: TCP Protocol: fix descriptor leak on listen and interrupt
If we try to listen on TCP port and ff_listen() fails on
interrupt callback socket (bind) descriptor overwrites and
does not closed at all.
As a result, we can't rebind to the same port.
Reviewed-by: Stephan Holljes <klaxa1337@googlemail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavformat/tcp.c')
-rw-r--r-- | libavformat/tcp.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/libavformat/tcp.c b/libavformat/tcp.c index bee349ecd5..e02c64b800 100644 --- a/libavformat/tcp.c +++ b/libavformat/tcp.c @@ -132,11 +132,11 @@ static int tcp_open(URLContext *h, const char *uri, int flags) goto fail1; } else if (s->listen == 1) { // single client - if ((fd = ff_listen_bind(fd, cur_ai->ai_addr, cur_ai->ai_addrlen, - s->listen_timeout, h)) < 0) { - ret = fd; + if ((ret = ff_listen_bind(fd, cur_ai->ai_addr, cur_ai->ai_addrlen, + s->listen_timeout, h)) < 0) goto fail1; - } + // Socket descriptor already closed here. Safe to overwrite to client one. + fd = ret; } else { if ((ret = ff_listen_connect(fd, cur_ai->ai_addr, cur_ai->ai_addrlen, s->open_timeout / 1000, h, !!cur_ai->ai_next)) < 0) { |