summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2022-08-05 11:45:49 +0200
committerCorinna Vinschen <corinna@vinschen.de>2022-08-05 11:45:49 +0200
commitd097a96e6e5319ab622d5d737c70b21e4a231bec (patch)
tree9cb5ad3d5af57c4114a8ffa314f9f98f329b2004
parent249f42d07a447ceb6fe22db5a2570f913cb5b4e5 (diff)
Cygwin: drop last usage of RtlCreateUnicodeStringFromAsciiz
This function is just bad. It really only works for ASCII chars, everything else is broken after the conversion. Introduce new helper function sys_mbstouni to replace RtlCreateUnicodeStringFromAsciiz in hash_path_name. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
-rw-r--r--winsup/cygwin/ntdll.h3
-rw-r--r--winsup/cygwin/path.cc6
-rw-r--r--winsup/cygwin/wchar.h12
3 files changed, 18 insertions, 3 deletions
diff --git a/winsup/cygwin/ntdll.h b/winsup/cygwin/ntdll.h
index bdc1c1e40..0f2310882 100644
--- a/winsup/cygwin/ntdll.h
+++ b/winsup/cygwin/ntdll.h
@@ -1556,7 +1556,8 @@ extern "C"
NTSTATUS RtlCreateAcl (PACL, ULONG, ULONG);
PDEBUG_BUFFER RtlCreateQueryDebugBuffer (ULONG, BOOLEAN);
NTSTATUS RtlCreateSecurityDescriptor (PSECURITY_DESCRIPTOR, ULONG);
- BOOLEAN RtlCreateUnicodeStringFromAsciiz (PUNICODE_STRING, PCSTR);
+ /* Don't use this function! It's almost always wrong! */
+ // BOOLEAN RtlCreateUnicodeStringFromAsciiz (PUNICODE_STRING, PCSTR);
NTSTATUS RtlDeleteSecurityObject (PSECURITY_DESCRIPTOR *);
NTSTATUS RtlDestroyQueryDebugBuffer (PDEBUG_BUFFER);
NTSTATUS RtlDowncaseUnicodeString (PUNICODE_STRING, PUNICODE_STRING, BOOLEAN);
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index b159b56d0..3e436dc65 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -3686,9 +3686,11 @@ ino_t
hash_path_name (ino_t hash, const char *name)
{
UNICODE_STRING uname;
- RtlCreateUnicodeStringFromAsciiz (&uname, name);
+ tmp_pathbuf tp;
+
+ tp.u_get (&uname);
+ sys_mbstouni (&uname, HEAP_NOTHEAP, name);
ino_t ret = hash_path_name (hash, &uname);
- RtlFreeUnicodeString (&uname);
return ret;
}
diff --git a/winsup/cygwin/wchar.h b/winsup/cygwin/wchar.h
index ff1d4f1fa..0484b27d5 100644
--- a/winsup/cygwin/wchar.h
+++ b/winsup/cygwin/wchar.h
@@ -92,9 +92,21 @@ sys_mbstowcs (wchar_t * dst, size_t dlen, const char *src,
size_t sys_mbstowcs_alloc (wchar_t **, int, const char *, size_t = (size_t) -1);
static inline size_t
+sys_mbstouni (PUNICODE_STRING dst, int type, const char *src,
+ size_t nms = (size_t) -1)
+{
+ /* sys_mbstowcs returns length *excluding* trailing \0 */
+ size_t len = sys_mbstowcs (dst->Buffer, type, src, nms);
+ dst->Length = len * sizeof (WCHAR);
+ dst->MaximumLength = dst->Length + sizeof (WCHAR);
+ return dst->Length;
+}
+
+static inline size_t
sys_mbstouni_alloc (PUNICODE_STRING dst, int type, const char *src,
size_t nms = (size_t) -1)
{
+ /* sys_mbstowcs returns length *including* trailing \0 */
size_t len = sys_mbstowcs_alloc (&dst->Buffer, type, src, nms);
dst->MaximumLength = len * sizeof (WCHAR);
dst->Length = dst->MaximumLength - sizeof (WCHAR);