Compare commits
2 Commits
refactor-e
...
fix_inheri
Author | SHA1 | Date | |
---|---|---|---|
020b3510ae | |||
dcf9887f56 |
@ -26,6 +26,8 @@ sc_process_execute_p(const char *const argv[], HANDLE *handle,
|
|||||||
HANDLE *pin, HANDLE *pout, HANDLE *perr) {
|
HANDLE *pin, HANDLE *pout, HANDLE *perr) {
|
||||||
enum sc_process_result ret = SC_PROCESS_ERROR_GENERIC;
|
enum sc_process_result ret = SC_PROCESS_ERROR_GENERIC;
|
||||||
|
|
||||||
|
bool inherit_handles = pin || pout || perr;
|
||||||
|
|
||||||
SECURITY_ATTRIBUTES sa;
|
SECURITY_ATTRIBUTES sa;
|
||||||
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
|
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
|
||||||
sa.lpSecurityDescriptor = NULL;
|
sa.lpSecurityDescriptor = NULL;
|
||||||
@ -69,7 +71,7 @@ sc_process_execute_p(const char *const argv[], HANDLE *handle,
|
|||||||
PROCESS_INFORMATION pi;
|
PROCESS_INFORMATION pi;
|
||||||
memset(&si, 0, sizeof(si));
|
memset(&si, 0, sizeof(si));
|
||||||
si.cb = sizeof(si);
|
si.cb = sizeof(si);
|
||||||
if (pin || pout || perr) {
|
if (inherit_handles) {
|
||||||
si.dwFlags = STARTF_USESTDHANDLES;
|
si.dwFlags = STARTF_USESTDHANDLES;
|
||||||
if (pin) {
|
if (pin) {
|
||||||
si.hStdInput = stdin_read_handle;
|
si.hStdInput = stdin_read_handle;
|
||||||
@ -95,8 +97,8 @@ sc_process_execute_p(const char *const argv[], HANDLE *handle,
|
|||||||
goto error_close_stderr;
|
goto error_close_stderr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!CreateProcessW(NULL, wide, NULL, NULL, TRUE, 0, NULL, NULL, &si,
|
if (!CreateProcessW(NULL, wide, NULL, NULL, inherit_handles, 0, NULL, NULL,
|
||||||
&pi)) {
|
&si, &pi)) {
|
||||||
free(wide);
|
free(wide);
|
||||||
*handle = NULL;
|
*handle = NULL;
|
||||||
|
|
||||||
|
@ -96,6 +96,27 @@ net_perror(const char *s) {
|
|||||||
sc_socket
|
sc_socket
|
||||||
net_socket(void) {
|
net_socket(void) {
|
||||||
sc_raw_socket raw_sock = socket(AF_INET, SOCK_STREAM, 0);
|
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);
|
sc_socket sock = wrap(raw_sock);
|
||||||
if (sock == SC_SOCKET_NONE) {
|
if (sock == SC_SOCKET_NONE) {
|
||||||
net_perror("socket");
|
net_perror("socket");
|
||||||
|
Reference in New Issue
Block a user