Skip to content

Commit

Permalink
Mark sockets as non-inheritable on Windows
Browse files Browse the repository at this point in the history
To be able to communicate with a child process via stdin, stdout and
stderr, the CreateProcess() parameter bInheritHandles must be set to
TRUE. But this causes *all* handles to be inherited, including sockets.

One possibility could be to use an extended API to set extra attributes
on process creation:
 - <https://stackoverflow.com/a/28185363/1987178>
 - <https://devblogs.microsoft.com/oldnewthing/20111216-00/?p=8873>
But it seems that this API is not available on MinGW (it does not
compile).

As an alternative, explicitly mark all sockets as non-inheritable.

Fixes #2779 <#2779>
  • Loading branch information
rom1v committed Nov 14, 2021
1 parent 6a27062 commit 66f3398
Showing 1 changed file with 21 additions and 0 deletions.
21 changes: 21 additions & 0 deletions app/src/util/net.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,27 @@ net_perror(const char *s) {
sc_socket
net_socket(void) {
sc_raw_socket raw_sock = socket(AF_INET, SOCK_STREAM, 0);

#ifdef _WIN32
/* To be able to communicate with a child process via stdin, stdout and
* stderr, the CreateProcess() parameter bInheritHandles must be set to
* TRUE. But this causes *all* handles to be inherited, including sockets.
*
* One possibility could be to use an extended API to set extra attributes
* on process creation:
* - <https://stackoverflow.com/a/28185363/1987178>
* - <https://devblogs.microsoft.com/oldnewthing/20111216-00/?p=8873>
* But it seems that this API is not available on MinGW (it does not
* compile).
*
* As an alternative, explicitly mark all sockets as non-inheritable.
*/
if (!SetHandleInformation((HANDLE) raw_sock, HANDLE_FLAG_INHERIT, 0)) {
closesocket(raw_sock);
return SC_SOCKET_NONE;
}
#endif

sc_socket sock = wrap(raw_sock);
if (sock == SC_SOCKET_NONE) {
net_perror("socket");
Expand Down

0 comments on commit 66f3398

Please sign in to comment.