< prev index next >
src/java.base/windows/native/libjli/java_md.c
Print this page
*** 1,7 ****
/*
! * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
--- 1,7 ----
/*
! * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
*** 494,503 ****
--- 494,534 ----
buffer[size - 1] = '\0';
}
return rc;
}
+ static errno_t convert_to_unicode(const char* path, const wchar_t* prefix, wchar_t** wpath) {
+ int unicode_path_len;
+ size_t prefix_len, wpath_len;
+
+ /*
+ * Get required buffer size to convert to Unicode.
+ * The return value includes the terminating null character.
+ */
+ unicode_path_len = MultiByteToWideChar(CP_THREAD_ACP, MB_ERR_INVALID_CHARS,
+ path, -1, NULL, 0);
+ if (unicode_path_len == 0) {
+ return EINVAL;
+ }
+
+ prefix_len = wcslen(prefix);
+ wpath_len = prefix_len + unicode_path_len;
+ *wpath = (wchar_t*)JLI_MemAlloc(wpath_len * sizeof(wchar_t));
+ if (*wpath == NULL) {
+ return ENOMEM;
+ }
+
+ wcsncpy(*wpath, prefix, prefix_len);
+ if (MultiByteToWideChar(CP_THREAD_ACP, MB_ERR_INVALID_CHARS,
+ path, -1, &((*wpath)[prefix_len]), (int)wpath_len) == 0) {
+ JLI_MemFree(*wpath);
+ return EINVAL;
+ }
+
+ return ERROR_SUCCESS;
+ }
+
/* taken from hotspot and slightly adjusted for jli lib;
* creates a UNC/ELP path from input 'path'
* the return buffer is allocated in C heap and needs to be freed using
* JLI_MemFree by the caller.
*/
*** 506,539 ****
size_t converted_chars = 0;
size_t path_len = strlen(path) + 1; /* includes the terminating NULL */
if (path[0] == '\\' && path[1] == '\\') {
if (path[2] == '?' && path[3] == '\\') {
/* if it already has a \\?\ don't do the prefix */
! wpath = (wchar_t*) JLI_MemAlloc(path_len * sizeof(wchar_t));
! if (wpath != NULL) {
! *err = mbstowcs_s(&converted_chars, wpath, path_len, path, path_len);
! } else {
! *err = ENOMEM;
! }
} else {
/* only UNC pathname includes double slashes here */
! wpath = (wchar_t*) JLI_MemAlloc((path_len + 7) * sizeof(wchar_t));
! if (wpath != NULL) {
! wcscpy(wpath, L"\\\\?\\UNC\0");
! *err = mbstowcs_s(&converted_chars, &wpath[7], path_len, path, path_len);
! } else {
! *err = ENOMEM;
! }
}
} else {
! wpath = (wchar_t*) JLI_MemAlloc((path_len + 4) * sizeof(wchar_t));
! if (wpath != NULL) {
! wcscpy(wpath, L"\\\\?\\\0");
! *err = mbstowcs_s(&converted_chars, &wpath[4], path_len, path, path_len);
! } else {
! *err = ENOMEM;
! }
}
return wpath;
}
int JLI_Open(const char* name, int flags) {
--- 537,553 ----
size_t converted_chars = 0;
size_t path_len = strlen(path) + 1; /* includes the terminating NULL */
if (path[0] == '\\' && path[1] == '\\') {
if (path[2] == '?' && path[3] == '\\') {
/* if it already has a \\?\ don't do the prefix */
! *err = convert_to_unicode(path, L"", &wpath);
} else {
/* only UNC pathname includes double slashes here */
! *err = convert_to_unicode(path, L"\\\\?\\UNC", &wpath);
}
} else {
! *err = convert_to_unicode(path, L"\\\\?\\", &wpath);
}
return wpath;
}
int JLI_Open(const char* name, int flags) {
< prev index next >