diff --git a/src/extract.c b/src/extract.c index 0261134f..f913575c 100644 --- a/src/extract.c +++ b/src/extract.c @@ -711,7 +711,7 @@ fixup_delayed_set_stat (char const *src, char const *dst) directories were created, nonzero (issuing a diagnostic) otherwise. Set *INTERDIR_MADE if at least one directory was created. */ static int -make_directories (char *file_name) +make_directories (char *file_name, bool *interdir_made) { char *cursor0 = file_name + FILE_SYSTEM_PREFIX_LEN (file_name); char *cursor; /* points into the file name */ @@ -755,6 +755,7 @@ make_directories (char *file_name) desired_mode, AT_SYMLINK_NOFOLLOW); print_for_mkdir (file_name, desired_mode); + *interdir_made = true; parent_end = NULL; } else @@ -910,11 +911,8 @@ maybe_recoverable (char *file_name, bool regular, bool *interdir_made) case ENOENT: /* Attempt creating missing intermediate directories. */ - if (make_directories (file_name) == 0) - { - *interdir_made = true; + if (make_directories (file_name, interdir_made) == 0) return RECOVER_OK; - } break; default: @@ -1109,7 +1107,7 @@ extract_dir (char *file_name, int typeflag) || old_files_option == NO_OVERWRITE_DIR_OLD_FILES || old_files_option == DEFAULT_OLD_FILES || old_files_option == OVERWRITE_OLD_FILES) - { + { struct stat st; st.st_mode = 0; @@ -1117,21 +1115,21 @@ extract_dir (char *file_name, int typeflag) && is_directory_link (file_name, &st)) return 0; - if ((st.st_mode != 0 && fstatat_flags == 0) - || deref_stat (file_name, &st) == 0) - { + if ((st.st_mode != 0 && fstatat_flags == 0) + || deref_stat (file_name, &st) == 0) + { current_mode = st.st_mode; current_mode_mask = ALL_MODE_BITS; if (S_ISDIR (current_mode)) - { - if (interdir_made) - { - repair_delayed_set_stat (file_name, &st); - return 0; - } - else if (old_files_option == NO_OVERWRITE_DIR_OLD_FILES) { + if (interdir_made) + { + repair_delayed_set_stat (file_name, &st); + return 0; + } + else if (old_files_option == NO_OVERWRITE_DIR_OLD_FILES) + { /* Temporarily change the directory mode to a safe value, to be able to create files in it, should the need be. @@ -2007,11 +2005,12 @@ rename_directory (char *src, char *dst) else { int e = errno; + bool interdir_made; switch (e) { case ENOENT: - if (make_directories (dst) == 0) + if (make_directories (dst, &interdir_made) == 0) { if (renameat (chdir_fd, src, chdir_fd, dst) == 0) return true;