Cygwin: cygheap: convert installation paths to UNICODE_STRINGS

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2018-12-25 01:06:34 +01:00
parent a7f392686b
commit 866901441b
5 changed files with 30 additions and 25 deletions

View File

@ -139,11 +139,11 @@ init_cygheap::init_installation_root ()
{ {
ptrdiff_t len = 0; ptrdiff_t len = 0;
if (!GetModuleFileNameW (cygwin_hmodule, installation_root, PATH_MAX)) if (!GetModuleFileNameW (cygwin_hmodule, installation_root_buf, PATH_MAX))
api_fatal ("Can't initialize Cygwin installation root dir.\n" api_fatal ("Can't initialize Cygwin installation root dir.\n"
"GetModuleFileNameW(%p, %p, %u), %E", "GetModuleFileNameW(%p, %p, %u), %E",
cygwin_hmodule, installation_root, PATH_MAX); cygwin_hmodule, installation_root_buf, PATH_MAX);
PWCHAR p = installation_root; PWCHAR p = installation_root_buf;
if (wcsncasecmp (p, L"\\\\", 2)) /* Normal drive letter path */ if (wcsncasecmp (p, L"\\\\", 2)) /* Normal drive letter path */
{ {
len = 4; len = 4;
@ -170,18 +170,18 @@ init_cygheap::init_installation_root ()
p = wcschr (p + 1, L'\\'); /* Skip share name */ p = wcschr (p + 1, L'\\'); /* Skip share name */
} }
} }
installation_root[1] = L'?'; installation_root_buf[1] = L'?';
RtlInitEmptyUnicodeString (&installation_key, installation_key_buf, RtlInitEmptyUnicodeString (&installation_key, installation_key_buf,
sizeof installation_key_buf); sizeof installation_key_buf);
RtlInt64ToHexUnicodeString (hash_path_name (0, installation_root), RtlInt64ToHexUnicodeString (hash_path_name (0, installation_root_buf),
&installation_key, FALSE); &installation_key, FALSE);
/* Strip off last path component ("\\cygwin1.dll") */ /* Strip off last path component ("\\cygwin1.dll") */
PWCHAR w = wcsrchr (installation_root, L'\\'); PWCHAR w = wcsrchr (installation_root_buf, L'\\');
if (w) if (w)
{ {
*w = L'\0'; *w = L'\0';
w = wcsrchr (installation_root, L'\\'); w = wcsrchr (installation_root_buf, L'\\');
} }
if (!w) if (!w)
api_fatal ("Can't initialize Cygwin installation root dir.\n" api_fatal ("Can't initialize Cygwin installation root dir.\n"
@ -190,15 +190,14 @@ init_cygheap::init_installation_root ()
/* Copy result into installation_dir before stripping off "bin" dir and /* Copy result into installation_dir before stripping off "bin" dir and
revert to Win32 path. This path is added to the Windows environment revert to Win32 path. This path is added to the Windows environment
in build_env. See there for a description. */ in build_env. See there for a description. */
installation_dir_len = wcpncpy (installation_dir, installation_root + len, wcpncpy (installation_dir_buf, installation_root_buf + len, PATH_MAX);
PATH_MAX)
- installation_dir;
if (len == 4) /* Local path */ if (len == 4) /* Local path */
; ;
else if (len == 6) /* UNC path */ else if (len == 6) /* UNC path */
installation_dir[0] = L'\\'; installation_dir_buf[0] = L'\\';
else /* Long, prefixed path */ else /* Long, prefixed path */
installation_dir[1] = L'\\'; installation_dir_buf[1] = L'\\';
/* If w < p, the Cygwin DLL resides in the root dir of a drive or network /* If w < p, the Cygwin DLL resides in the root dir of a drive or network
path. In that case, if we strip off yet another backslash, the path path. In that case, if we strip off yet another backslash, the path
@ -208,12 +207,15 @@ init_cygheap::init_installation_root ()
if (w > p) if (w > p)
*w = L'\0'; *w = L'\0';
RtlInitUnicodeString (&installation_root, installation_root_buf);
RtlInitUnicodeString (&installation_dir, installation_dir_buf);
for (int i = 1; i >= 0; --i) for (int i = 1; i >= 0; --i)
{ {
reg_key r (i, KEY_WRITE, _WIDE (CYGWIN_INFO_INSTALLATIONS_NAME), reg_key r (i, KEY_WRITE, _WIDE (CYGWIN_INFO_INSTALLATIONS_NAME),
NULL); NULL);
if (NT_SUCCESS (r.set_string (installation_key_buf, if (NT_SUCCESS (r.set_string (installation_key_buf,
installation_root))) installation_root_buf)))
break; break;
} }
} }

View File

@ -557,9 +557,10 @@ struct init_cygheap: public mini_cygheap
_cmalloc_entry *chain; _cmalloc_entry *chain;
unsigned bucket_val[NBUCKETS]; unsigned bucket_val[NBUCKETS];
char *buckets[NBUCKETS]; char *buckets[NBUCKETS];
WCHAR installation_root[PATH_MAX]; UNICODE_STRING installation_root;
WCHAR installation_dir[PATH_MAX]; WCHAR installation_root_buf[PATH_MAX];
size_t installation_dir_len; UNICODE_STRING installation_dir;
WCHAR installation_dir_buf[PATH_MAX];
UNICODE_STRING installation_key; UNICODE_STRING installation_key;
WCHAR installation_key_buf[18]; WCHAR installation_key_buf[18];
cygheap_root root; cygheap_root root;

View File

@ -1282,10 +1282,11 @@ build_env (const char * const *envp, PWCHAR &envblock, int &envc,
during execve. */ during execve. */
if (!saw_PATH) if (!saw_PATH)
{ {
new_tl += cygheap->installation_dir_len + 5; new_tl += cygheap->installation_dir.Length / sizeof (WCHAR) + 5;
if (new_tl > tl) if (new_tl > tl)
tl = raise_envblock (new_tl, envblock, s); tl = raise_envblock (new_tl, envblock, s);
s = wcpcpy (wcpcpy (s, L"PATH="), cygheap->installation_dir) + 1; s = wcpcpy (wcpcpy (s, L"PATH="),
cygheap->installation_dir.Buffer) + 1;
} }
*s = L'\0'; /* Two null bytes at the end */ *s = L'\0'; /* Two null bytes at the end */
assert ((s - envblock) <= tl); /* Detect if we somehow ran over end assert ((s - envblock) <= tl); /* Detect if we somehow ran over end

View File

@ -492,7 +492,7 @@ mount_info::init (bool user_init)
PWCHAR pathend; PWCHAR pathend;
WCHAR path[PATH_MAX]; WCHAR path[PATH_MAX];
pathend = wcpcpy (path, cygheap->installation_root); pathend = wcpcpy (path, cygheap->installation_root.Buffer);
if (!user_init) if (!user_init)
create_root_entry (path); create_root_entry (path);

View File

@ -1305,11 +1305,11 @@ cygheap_pwdgrp::_nss_init ()
char *buf = tp.c_get (); char *buf = tp.c_get ();
PCWSTR rel_path = L"\\etc\\nsswitch.conf"; PCWSTR rel_path = L"\\etc\\nsswitch.conf";
path.Length = (wcslen (cygheap->installation_root) + wcslen (rel_path)) path.Length = cygheap->installation_root.Length
* sizeof (WCHAR); + wcslen (rel_path) * sizeof (WCHAR);
path.MaximumLength = path.Length + sizeof (WCHAR); path.MaximumLength = path.Length + sizeof (WCHAR);
path.Buffer = (PWCHAR) alloca (path.MaximumLength); path.Buffer = (PWCHAR) alloca (path.MaximumLength);
wcpcpy (wcpcpy (path.Buffer, cygheap->installation_root), rel_path); wcpcpy (wcpcpy (path.Buffer, cygheap->installation_root.Buffer), rel_path);
InitializeObjectAttributes (&attr, &path, OBJ_CASE_INSENSITIVE, InitializeObjectAttributes (&attr, &path, OBJ_CASE_INSENSITIVE,
NULL, NULL); NULL, NULL);
if (rl.init (&attr, buf, NT_MAX_PATH)) if (rl.init (&attr, buf, NT_MAX_PATH))
@ -1665,11 +1665,12 @@ pwdgrp::check_file ()
if (!path.Buffer) if (!path.Buffer)
{ {
PCWSTR rel_path = is_group () ? L"\\etc\\group" : L"\\etc\\passwd"; PCWSTR rel_path = is_group () ? L"\\etc\\group" : L"\\etc\\passwd";
path.Length = (wcslen (cygheap->installation_root) + wcslen (rel_path)) path.Length = cygheap->installation_root.Length
* sizeof (WCHAR); + wcslen (rel_path) * sizeof (WCHAR);
path.MaximumLength = path.Length + sizeof (WCHAR); path.MaximumLength = path.Length + sizeof (WCHAR);
path.Buffer = (PWCHAR) cmalloc_abort (HEAP_BUF, path.MaximumLength); path.Buffer = (PWCHAR) cmalloc_abort (HEAP_BUF, path.MaximumLength);
wcpcpy (wcpcpy (path.Buffer, cygheap->installation_root), rel_path); wcpcpy (wcpcpy (path.Buffer, cygheap->installation_root.Buffer),
rel_path);
InitializeObjectAttributes (&attr, &path, OBJ_CASE_INSENSITIVE, InitializeObjectAttributes (&attr, &path, OBJ_CASE_INSENSITIVE,
NULL, NULL); NULL, NULL);
} }