[libcxx-commits] [libcxx] 29012ce - [libcxx] Map ERROR_BAD_PATHNAME to errc::no_such_file_or_directory on windows

Martin Storsjö via libcxx-commits libcxx-commits at lists.llvm.org
Fri Mar 5 00:49:22 PST 2021


Author: Martin Storsjö
Date: 2021-03-05T10:49:03+02:00
New Revision: 29012ce986fcb24175f19317b4e2d119cd8cdbb2

URL: https://github.com/llvm/llvm-project/commit/29012ce986fcb24175f19317b4e2d119cd8cdbb2
DIFF: https://github.com/llvm/llvm-project/commit/29012ce986fcb24175f19317b4e2d119cd8cdbb2.diff

LOG: [libcxx] Map ERROR_BAD_PATHNAME to errc::no_such_file_or_directory on windows

Opening a path like \\server (without a trailing share name and
path) produces this error, while opening e.g. \\server\share
(for a nonexistent server/share) produces ERROR_BAD_NETPATH (which
already is mapped).

This happens in some testcases (in fs.op.proximate); as proximate()
calls weakly_canonical() on the inputs, weakly_canonical() checks
whether the path exists or not. When the error code wasn't recognized
(it mapped to errc::invalid_argument), the stat operation wasn't
conclusive and weakly_canonical() errored out. With the proper error
code mapping, this isn't considered an error, just a nonexistent
path, and weakly_canonical() can proceed.

This roughly matches what MS STL does - it doesn't have
ERROR_BAD_PATHNAME in its error code mapping table, but it
checks for this error code specifically in the return of their
correspondence of the stat function.

Differential Revision: https://reviews.llvm.org/D97619

Added: 
    

Modified: 
    libcxx/src/filesystem/operations.cpp

Removed: 
    


################################################################################
diff  --git a/libcxx/src/filesystem/operations.cpp b/libcxx/src/filesystem/operations.cpp
index 35f6937a7d10..a002d0a5c93e 100644
--- a/libcxx/src/filesystem/operations.cpp
+++ b/libcxx/src/filesystem/operations.cpp
@@ -412,6 +412,7 @@ errc __win_err_to_errc(int err) {
       {ERROR_ACCESS_DENIED, errc::permission_denied},
       {ERROR_ALREADY_EXISTS, errc::file_exists},
       {ERROR_BAD_NETPATH, errc::no_such_file_or_directory},
+      {ERROR_BAD_PATHNAME, errc::no_such_file_or_directory},
       {ERROR_BAD_UNIT, errc::no_such_device},
       {ERROR_BROKEN_PIPE, errc::broken_pipe},
       {ERROR_BUFFER_OVERFLOW, errc::filename_too_long},


        


More information about the libcxx-commits mailing list