diff --git a/src/remote/inet.cpp b/src/remote/inet.cpp index f4acc1a0560..d0759d2fe33 100644 --- a/src/remote/inet.cpp +++ b/src/remote/inet.cpp @@ -2005,7 +2005,8 @@ static int fork( SOCKET old_handle, USHORT flag) } Firebird::string cmdLine; - cmdLine.printf("%s -i -h %"SLONGFORMAT, name, (SLONG) new_handle); + cmdLine.printf("%s -i -h %"SLONGFORMAT"@%"SLONGFORMAT, name, (SLONG) new_handle, + GetCurrentProcessId()); STARTUPINFO start_crud; start_crud.cb = sizeof(STARTUPINFO); @@ -2017,12 +2018,13 @@ static int fork( SOCKET old_handle, USHORT flag) start_crud.dwFlags = STARTF_FORCEOFFFEEDBACK; PROCESS_INFORMATION pi; - if (CreateProcess(NULL, cmdLine.begin(), NULL, NULL, TRUE, + if (CreateProcess(NULL, cmdLine.begin(), NULL, NULL, FALSE, (flag & SRVR_high_priority ? HIGH_PRIORITY_CLASS | DETACHED_PROCESS : NORMAL_PRIORITY_CLASS | DETACHED_PROCESS), NULL, NULL, &start_crud, &pi)) { + // hvlad: child process will close our handle of just accepted socket CloseHandle(pi.hThread); CloseHandle(pi.hProcess); return 1; diff --git a/src/remote/os/win32/srvr_w32.cpp b/src/remote/os/win32/srvr_w32.cpp index 8ee693c1569..542bfbfbcae 100644 --- a/src/remote/os/win32/srvr_w32.cpp +++ b/src/remote/os/win32/srvr_w32.cpp @@ -587,13 +587,47 @@ static HANDLE parse_args( LPCSTR lpszArgs, USHORT * pserver_flag) case 'H': while (*p && *p == ' ') p++; - if (*p) { - char *pp = buffer; - while (*p && *p != ' ') { - *pp++ = *p++; + if (*p) + { + TEXT buffer[32]; + char* pp = buffer; + while (*p && *p != ' ' && (pp - buffer < sizeof(buffer) - 1)) + { + if (*p == '@') + { + p++; + *pp++ = '\0'; + connection_handle = (HANDLE) _atoi64(buffer); + pp = buffer; + } + else + *pp++ = *p++; } *pp++ = '\0'; - connection_handle = (HANDLE) atol(buffer); + + if (connection_handle == INVALID_HANDLE_VALUE) + { + connection_handle = (HANDLE) _atoi64(buffer); + } + else + { + const DWORD parent_id = atol(buffer); + const HANDLE parent_handle = OpenProcess(PROCESS_DUP_HANDLE, FALSE, parent_id); + if (!parent_handle) + { + gds__log("SERVER: OpenProcess failed. Errno = %d, parent PID = %d", GetLastError(), parent_id); + exit(FINI_ERROR); + } + + if (!DuplicateHandle(parent_handle, connection_handle, GetCurrentProcess(), &connection_handle, + 0, FALSE, DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE)) + { + gds__log("SERVER: DuplicateHandle failed. Errno = %d, parent PID = %d", GetLastError(), parent_id); + exit(FINI_ERROR); + } + + CloseHandle(parent_handle); + } } break; #endif diff --git a/src/remote/os/win32/wnet.cpp b/src/remote/os/win32/wnet.cpp index a2f60fe4a56..1d9a98966a1 100644 --- a/src/remote/os/win32/wnet.cpp +++ b/src/remote/os/win32/wnet.cpp @@ -416,7 +416,8 @@ rem_port* WNET_connect(const TEXT* name, GetModuleFileName(NULL, name, sizeof(name)); Firebird::string cmdLine; - cmdLine.printf("%s -w -h %"SLONGFORMAT, name, (SLONG) port->port_handle); + cmdLine.printf("%s -w -h %"SLONGFORMAT"@%"SLONGFORMAT, name, (SLONG) port->port_handle, + GetCurrentProcessId()); STARTUPINFO start_crud; PROCESS_INFORMATION pi; @@ -428,16 +429,21 @@ rem_port* WNET_connect(const TEXT* name, start_crud.lpTitle = NULL; start_crud.dwFlags = STARTF_FORCEOFFFEEDBACK; - if (CreateProcess(NULL, cmdLine.begin(), NULL, NULL, TRUE, + if (CreateProcess(NULL, cmdLine.begin(), NULL, NULL, FALSE, (flag & SRVR_high_priority ? HIGH_PRIORITY_CLASS | DETACHED_PROCESS : NORMAL_PRIORITY_CLASS | DETACHED_PROCESS), NULL, NULL, &start_crud, &pi)) { + // hvlad: child process will close our handle of client pipe CloseHandle(pi.hThread); CloseHandle(pi.hProcess); } - CloseHandle(port->port_handle); + else + { + gds__log("WNET/inet_error: fork/CreateProcess errno = %d", GetLastError()); + CloseHandle(port->port_handle); + } } #endif /* REQUESTER */ } diff --git a/src/remote/xnet.cpp b/src/remote/xnet.cpp index fdd3872c13d..854a7511562 100644 --- a/src/remote/xnet.cpp +++ b/src/remote/xnet.cpp @@ -2438,7 +2438,7 @@ static bool fork(ULONG client_pid, USHORT flag, ULONG* forked_pid) PROCESS_INFORMATION pi; const bool cp_result = - CreateProcess(NULL, cmdLine.begin(), NULL, NULL, TRUE, + CreateProcess(NULL, cmdLine.begin(), NULL, NULL, FALSE, (flag & SRVR_high_priority ? HIGH_PRIORITY_CLASS : NORMAL_PRIORITY_CLASS) | DETACHED_PROCESS | CREATE_SUSPENDED, NULL, NULL, &start_crud, &pi);