]> git.ipfire.org Git - thirdparty/libarchive.git/commit
Fix replacing a regular file with a dir for ARCHIVE_EXTRACT_SAFE_WRITES 2477/head
authorJessica Clarke <jrtc27@jrtc27.com>
Tue, 7 Jan 2025 20:59:09 +0000 (20:59 +0000)
committerJessica Clarke <jrtc27@jrtc27.com>
Tue, 7 Jan 2025 20:59:09 +0000 (20:59 +0000)
commit27588eba5077c1dd311924c51063289c0cbe4db3
tree0de8791d7a5ae9541c5cc38aa2f40c35e50e6e80
parent42565b88b5cc7441239269902a9d1735fd9ca0e2
Fix replacing a regular file with a dir for ARCHIVE_EXTRACT_SAFE_WRITES

The outer if checks !S_ISDIR(a->st.st_mode), so we know that the file
being overwritten is not a directory, and thus we can rename(2) over it
if we want to, but whether we can use a temporary regular file is a
property of the file being extracted. Otherwise, when replacing a
regular file with a directory, we end up in this case and create a
temporary regular file for the new directory, but with the permissions
of the directory (which likely includes x), and rename it over the top
at the end. Depending on where the archive_entry came from, it may have
a non-zero size that also isn't ovewritten with 0 (e.g. if it came from
stat(2)) and so the API user may then try to copy data (thus failing if
read(2) of directories isn't permitted, or writing the raw directory
contents if it is), but if the size is zero as is the case for this tar
test then it will end up not writing any data and "successfully"
overwrite the file with an empty file, not a directory.
libarchive/archive_write_disk_posix.c
tar/test/test_option_safe_writes.c