diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2011-11-18 21:38:04 +0400 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2011-11-18 21:38:04 +0400 |
commit | c5785504f8e8695c8dd2dae97d096243e0e22ab4 (patch) | |
tree | d11ad2fde5b153401b0138823b7f809a572574d2 /winsup/cygwin/shared.cc | |
parent | 6a8a9ad8d8217a1cae56151836e6c1d9b685d387 (diff) |
* shared.cc (get_shared_parent_dir): Use global shared_parent_dir
instead of local dir variable and create handle not inheritable to
avoid accumulating stray handles in child processes.
(get_session_parent_dir): Ditto with session_parent_dir variable.
Diffstat (limited to 'winsup/cygwin/shared.cc')
-rw-r--r-- | winsup/cygwin/shared.cc | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/winsup/cygwin/shared.cc b/winsup/cygwin/shared.cc index 70356b7e5..0f1be92af 100644 --- a/winsup/cygwin/shared.cc +++ b/winsup/cygwin/shared.cc @@ -127,15 +127,16 @@ init_installation_root () /* This function returns a handle to the top-level directory in the global NT namespace used to implement global objects including shared memory. */ +static HANDLE NO_COPY shared_parent_dir; + HANDLE get_shared_parent_dir () { - static HANDLE dir; UNICODE_STRING uname; OBJECT_ATTRIBUTES attr; NTSTATUS status; - if (!dir) + if (!shared_parent_dir) { WCHAR bnoname[MAX_PATH]; __small_swprintf (bnoname, L"\\BaseNamedObjects\\%s%s-%S", @@ -143,31 +144,33 @@ get_shared_parent_dir () _cygwin_testing ? cygwin_version.dll_build_date : "", &installation_key); RtlInitUnicodeString (&uname, bnoname); - InitializeObjectAttributes (&attr, &uname, OBJ_INHERIT | OBJ_OPENIF, - NULL, everyone_sd (CYG_SHARED_DIR_ACCESS)); - status = NtCreateDirectoryObject (&dir, CYG_SHARED_DIR_ACCESS, &attr); + InitializeObjectAttributes (&attr, &uname, OBJ_OPENIF, NULL, + everyone_sd (CYG_SHARED_DIR_ACCESS)); + status = NtCreateDirectoryObject (&shared_parent_dir, + CYG_SHARED_DIR_ACCESS, &attr); if (!NT_SUCCESS (status)) api_fatal ("NtCreateDirectoryObject(%S): %p", &uname, status); } - return dir; + return shared_parent_dir; } +static HANDLE NO_COPY session_parent_dir; + HANDLE get_session_parent_dir () { - static HANDLE dir; UNICODE_STRING uname; OBJECT_ATTRIBUTES attr; NTSTATUS status; - if (!dir) + if (!session_parent_dir) { PROCESS_SESSION_INFORMATION psi; status = NtQueryInformationProcess (NtCurrentProcess (), ProcessSessionInformation, &psi, sizeof psi, NULL); if (!NT_SUCCESS (status) || psi.SessionId == 0) - dir = get_shared_parent_dir (); + session_parent_dir = get_shared_parent_dir (); else { WCHAR bnoname[MAX_PATH]; @@ -177,14 +180,15 @@ get_session_parent_dir () _cygwin_testing ? cygwin_version.dll_build_date : "", &installation_key); RtlInitUnicodeString (&uname, bnoname); - InitializeObjectAttributes (&attr, &uname, OBJ_INHERIT | OBJ_OPENIF, - NULL, everyone_sd(CYG_SHARED_DIR_ACCESS)); - status = NtCreateDirectoryObject (&dir, CYG_SHARED_DIR_ACCESS, &attr); + InitializeObjectAttributes (&attr, &uname, OBJ_OPENIF, NULL, + everyone_sd(CYG_SHARED_DIR_ACCESS)); + status = NtCreateDirectoryObject (&session_parent_dir, + CYG_SHARED_DIR_ACCESS, &attr); if (!NT_SUCCESS (status)) api_fatal ("NtCreateDirectoryObject(%S): %p", &uname, status); } } - return dir; + return session_parent_dir; } char * __stdcall |