|
@@ -1,4 +1,4 @@
|
|
|
-// Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
|
|
|
+// Copyright (C) 2010, 2014 Internet Systems Consortium, Inc. ("ISC")
|
|
|
//
|
|
|
// Permission to use, copy, modify, and/or distribute this software for any
|
|
|
// purpose with or without fee is hereby granted, provided that the above
|
|
@@ -107,13 +107,15 @@ recv_fd(const int sock) {
|
|
|
std::memcpy(&fd, CMSG_DATA(cmsg), sizeof(int));
|
|
|
}
|
|
|
free(msghdr.msg_control);
|
|
|
- // It is strange, but the call can return the same file descriptor as
|
|
|
- // 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));
|
|
|
- // Only call close() if the descriptor is valid. Otherwise return
|
|
|
- // an error.
|
|
|
- int close_error(fd >=0 ? close(fd) : -1);
|
|
|
+ int new_fd = -1;
|
|
|
+ int close_error = -1;
|
|
|
+ if (fd >= 0) {
|
|
|
+ // It is strange, but the call can return the same file descriptor as
|
|
|
+ // one returned previously, even if that one is not closed yet. So,
|
|
|
+ // we just re-number every one we get, so they are unique.
|
|
|
+ new_fd = dup(fd);
|
|
|
+ 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.
|