summaryrefslogtreecommitdiff
path: root/src/w32.c
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2013-12-09 21:18:58 +0200
committerEli Zaretskii <eliz@gnu.org>2013-12-09 21:18:58 +0200
commitafec5165194e5d44c0af4f6f20e26e29aab79cdf (patch)
tree143a5dc7e6e3e65439b46f6d8767da525bca4e4c /src/w32.c
parent245ddcaa82a7778f662f28584eab8be48c7cfede (diff)
downloademacs-afec5165194e5d44c0af4f6f20e26e29aab79cdf.tar.gz
Fixed file-truename when w32-unicode-filenames is nil, fixed its doc.
Diffstat (limited to 'src/w32.c')
-rw-r--r--src/w32.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/w32.c b/src/w32.c
index 7e32da84c58..db0b4fee485 100644
--- a/src/w32.c
+++ b/src/w32.c
@@ -2123,7 +2123,7 @@ parse_root (const char * name, const char ** pPath)
static int
get_long_basename (char * name, char * buf, int size)
{
- HANDLE dir_handle;
+ HANDLE dir_handle = INVALID_HANDLE_VALUE;
char fname_utf8[MAX_UTF8_PATH];
int len = 0;
int cstatus = -1;
@@ -2148,9 +2148,19 @@ get_long_basename (char * name, char * buf, int size)
WIN32_FIND_DATAA find_data_ansi;
filename_to_ansi (name, fname_ansi);
- dir_handle = FindFirstFileA (fname_ansi, &find_data_ansi);
- if (dir_handle != INVALID_HANDLE_VALUE)
- cstatus = filename_from_ansi (find_data_ansi.cFileName, fname_utf8);
+ /* If the ANSI name includes ? characters, it is not encodable
+ in the ANSI codepage. In that case, we deliver the question
+ marks to the caller; calling FindFirstFileA in this case
+ could return some unrelated file name in the same
+ directory. */
+ if (_mbspbrk (fname_ansi, "?"))
+ cstatus = filename_from_ansi (fname_ansi, fname_utf8);
+ else
+ {
+ dir_handle = FindFirstFileA (fname_ansi, &find_data_ansi);
+ if (dir_handle != INVALID_HANDLE_VALUE)
+ cstatus = filename_from_ansi (find_data_ansi.cFileName, fname_utf8);
+ }
}
if (cstatus == 0 && (len = strlen (fname_utf8)) < size)