We used to respect the target file mode when pre-creating files in set_xattr, so we also pre-created read-only files that we were not able to open later for writing. This is now fixed, and we always create the file with S_IWUSR.
Fixes the original bug report https://bugzilla.redhat.com/1886540 * src/extract.c (set_xattr): Blindly add S_IWUSR flag to pre-created files, to avoid openat failures later. --- src/extract.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/extract.c b/src/extract.c index b73a591..2e650ad 100644 --- a/src/extract.c +++ b/src/extract.c @@ -865,7 +865,13 @@ set_xattr (char const *file_name, struct tar_stat_info const *st, for (;;) { - if (!mknodat (chdir_fd, file_name, mode ^ invert_permissions, 0)) + /* We'll open the file with O_WRONLY later by open_output_file, + therefore we need to give us the S_IWUSR bit. If the file was + meant to be user-read-only, the permissions will be corrected by + the set_stat call. */ + mode_t initial_mode = mode ^ invert_permissions | S_IWUSR; + + if (!mknodat (chdir_fd, file_name, initial_mode, 0)) { /* Successfully created file */ xattrs_xattrs_set (st, file_name, typeflag, 0); -- 2.28.0