diff --git a/README.md b/README.md index 5da485700..1cd540dc3 100755 --- a/README.md +++ b/README.md @@ -1286,6 +1286,7 @@ Winlin [bug #512]: https://github.com/ossrs/srs/issues/512 [bug #515]: https://github.com/ossrs/srs/issues/515 [bug #511]: https://github.com/ossrs/srs/issues/511 +[bug #518]: https://github.com/ossrs/srs/issues/518 [bug #xxxxxxxxxx]: https://github.com/ossrs/srs/issues/xxxxxxxxxx [exo #828]: https://github.com/google/ExoPlayer/pull/828 diff --git a/trunk/scripts/_log.sh b/trunk/scripts/_log.sh index 0dabad414..21a82684c 100755 --- a/trunk/scripts/_log.sh +++ b/trunk/scripts/_log.sh @@ -8,7 +8,7 @@ RED="\\033[31m" GREEN="\\033[32m" YELLOW="\\033[33m" BLACK="\\033[0m" -POS="\\033[103G" +POS="\\033[94G" # if need to log to file, change the log path. if [[ ! $log ]]; then diff --git a/trunk/src/app/srs_app_server.cpp b/trunk/src/app/srs_app_server.cpp index 4370ed30c..e049ad500 100755 --- a/trunk/src/app/srs_app_server.cpp +++ b/trunk/src/app/srs_app_server.cpp @@ -1253,10 +1253,10 @@ int SrsServer::accept_client(SrsListenerType type, st_netfd_t client_stfd) { int ret = ERROR_SUCCESS; + int fd = st_netfd_fileno(client_stfd); + int max_connections = _srs_config->get_max_connections(); if ((int)conns.size() >= max_connections) { - int fd = st_netfd_fileno(client_stfd); - srs_error("exceed the max connections, drop client: " "clients=%d, max=%d, fd=%d", (int)conns.size(), max_connections, fd); @@ -1265,6 +1265,25 @@ int SrsServer::accept_client(SrsListenerType type, st_netfd_t client_stfd) return ret; } + // avoid fd leak when fork. + // @see https://github.com/ossrs/srs/issues/518 + if (true) { + int val; + if ((val = fcntl(fd, F_GETFD, 0)) < 0) { + ret = ERROR_SYSTEM_PID_GET_FILE_INFO; + srs_error("fnctl F_GETFD error! fd=%d. ret=%#x", fd, ret); + srs_close_stfd(client_stfd); + return ret; + } + val |= FD_CLOEXEC; + if (fcntl(fd, F_SETFD, val) < 0) { + ret = ERROR_SYSTEM_PID_SET_FILE_INFO; + srs_error("fcntl F_SETFD error! fd=%d ret=%#x", fd, ret); + srs_close_stfd(client_stfd); + return ret; + } + } + SrsConnection* conn = NULL; if (type == SrsListenerRtmpStream) { conn = new SrsRtmpConn(this, kafka, client_stfd);