From: Michal 'vorner' Vaner Date: Tue, 28 Feb 2012 18:05:10 +0000 (+0100) Subject: [1705] Don't leak the fd on close error X-Git-Tag: trac2351_base~226^2~116^2~156^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1c1308a191d8e151abb28acbb22db033764acb67;p=thirdparty%2Fkea.git [1705] Don't leak the fd on close error --- diff --git a/src/lib/util/io/fd_share.cc b/src/lib/util/io/fd_share.cc index 2d6c338760..7adbbbe9fa 100644 --- a/src/lib/util/io/fd_share.cc +++ b/src/lib/util/io/fd_share.cc @@ -111,7 +111,14 @@ recv_fd(const int sock) { // one returned previously, even if that one is not closed yet. So, // we just re-number every one we get, so they are unique. int new_fd(dup(fd)); - if (close(fd) == -1 || new_fd == -1) { + int close_error(close(fd)); + if (close_error == -1 || new_fd == -1) { + // We need to return an error, because something failed. But in case + // it was the previous close, we at least try to close the duped FD. + if (new_fd != -1) { + close(new_fd); // If this fails, nothing but returning error can't + // be done and we are doing that anyway. + } return (FD_SYSTEM_ERROR); } return (new_fd);