diff options
author | John Högberg <[email protected]> | 2019-03-21 17:31:47 +0100 |
---|---|---|
committer | John Högberg <[email protected]> | 2019-03-22 09:38:15 +0100 |
commit | 526bc873d91b134ffab0c484553d42a510bccd96 (patch) | |
tree | 24a0983d0d6f9cc188a1a44fa2af73e9e1fe8781 /erts/emulator/nifs/win32 | |
parent | 22868eccf702d49c5813f0ab060fc86d67342b85 (diff) | |
download | otp-526bc873d91b134ffab0c484553d42a510bccd96.tar.gz otp-526bc873d91b134ffab0c484553d42a510bccd96.tar.bz2 otp-526bc873d91b134ffab0c484553d42a510bccd96.zip |
erts: Fix incorrect UNC path length calculation
This didn't cause any issues for the most part since the path was
still properly formed, but it broke down when appending the
wildcards in file:list_dir/1. The ASSERT_PATH_FORMAT macro would
have caught this in no time, but it went unnoticed because we don't
run debug builds on Windows.
Diffstat (limited to 'erts/emulator/nifs/win32')
-rw-r--r-- | erts/emulator/nifs/win32/win_prim_file.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/erts/emulator/nifs/win32/win_prim_file.c b/erts/emulator/nifs/win32/win_prim_file.c index d0aa70542f..e7d3924240 100644 --- a/erts/emulator/nifs/win32/win_prim_file.c +++ b/erts/emulator/nifs/win32/win_prim_file.c @@ -142,12 +142,15 @@ static posix_errno_t get_full_path(ErlNifEnv *env, WCHAR *input, efile_path_t *r maybe_unc_path = !sys_memcmp(result->data, L"\\\\", sizeof(WCHAR) * 2); if(maybe_unc_path && !is_long_path) { - /* \\localhost\c$\gurka -> \\?\UNC\localhost\c$\gurka */ + /* \\localhost\c$\gurka -> \\?\UNC\localhost\c$\gurka + * + * Note that the length is reduced by 2 as the "\\" is replaced by + * the UNC prefix */ sys_memmove(result->data + LP_UNC_PREFIX_SIZE, &((WCHAR*)result->data)[2], - (actual_length - 1) * sizeof(WCHAR)); + (actual_length + 1 - 2) * sizeof(WCHAR)); sys_memcpy(result->data, LP_UNC_PREFIX, LP_UNC_PREFIX_SIZE); - actual_length += LP_UNC_PREFIX_LENGTH; + actual_length += LP_UNC_PREFIX_LENGTH - 2; } else if(!is_long_path) { /* C:\gurka -> \\?\C:\gurka */ sys_memmove(result->data + LP_PREFIX_SIZE, result->data, |