================
@@ -122,8 +123,14 @@ struct ForkLaunchInfo {
ExitWithError(error_fd, "close");
break;
case FileAction::eFileActionDuplicate:
- if (dup2(action.fd, action.arg) == -1)
- ExitWithError(error_fd, "dup2");
+ if (action.fd != action.arg) {
+ if (dup2(action.fd, action.arg) == -1)
+ ExitWithError(error_fd, "dup2");
+ } else {
+ if (fcntl(action.fd, F_SETFD,
+ fcntl(action.fd, F_GETFD) & ~FD_CLOEXEC) == -1)
----------------
labath wrote:
Yes, I guess.
It's a potential leak, but it's not one that this code, or anything in the
parent process can fix. Directly after an execve, all FDs will have the CLOEXEC
flag cleared -- by definition. No matter what you do, if you want to pass an FD
through execve, you have to ensure that flag is cleared at the time you call
execve. Previously we did that by doing nothing. Now we do it by setting the
flag as early as possible (ideally when the FD is created), and clearing it
after the fork.
What the happens to the FD afterwards is out of our hands. If the process
doesn't want to pass the fd on, it should set the flag, or otherwise ensure it
gets closed. But there's nothing we can do to about it if it chooses to ignore
that.
https://github.com/llvm/llvm-project/pull/126935
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits