diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2024-07-30 10:55:55 +0100 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2024-07-30 14:36:06 +0100 |
commit | 017e3f89b081e4828a588a3bd27b5feacea042b7 (patch) | |
tree | a3f746103cc1b4b1e428649c6136c77f4a855841 /gcc | |
parent | 658193658f05e9a8ebf0bce8bab15555f43bfee1 (diff) | |
download | gcc-017e3f89b081e4828a588a3bd27b5feacea042b7.zip gcc-017e3f89b081e4828a588a3bd27b5feacea042b7.tar.gz gcc-017e3f89b081e4828a588a3bd27b5feacea042b7.tar.bz2 |
libstdc++: Fix overwriting files with fs::copy_file on Windows
There are no inode numbers on Windows filesystems, so stat_type::st_ino
is always zero and the check for equivalent files in do_copy_file was
incorrectly identifying distinct files as equivalent. This caused
copy_file to incorrectly report errors when trying to overwrite existing
files.
The fs::equivalent function already does the right thing on Windows, so
factor that logic out into a new function that can be reused by
fs::copy_file.
The tests for fs::copy_file were quite inadequate, so this also adds
checks for that function's error conditions.
libstdc++-v3/ChangeLog:
* src/c++17/fs_ops.cc (auto_win_file_handle): Change constructor
parameter from const path& to const wchar_t*.
(fs::equiv_files): New function.
(fs::equivalent): Use equiv_files.
* src/filesystem/ops-common.h (fs::equiv_files): Declare.
(do_copy_file): Use equiv_files.
* src/filesystem/ops.cc (fs::equiv_files): Define.
(fs::copy, fs::equivalent): Use equiv_files.
* testsuite/27_io/filesystem/operations/copy.cc: Test
overwriting directory contents recursively.
* testsuite/27_io/filesystem/operations/copy_file.cc: Test
overwriting existing files.
Diffstat (limited to 'gcc')
0 files changed, 0 insertions, 0 deletions