diff --git a/src/buffer.c b/src/buffer.c index a9660324..7fd43f64 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -310,7 +310,7 @@ open_archive (enum access_mode wanted_access) } else if (strcmp (archive_name_array[0], "-") == 0) { - read_full_records_option = 1; /* could be a pipe, be safe */ + read_full_records_option = true; /* could be a pipe, be safe */ if (verify_option) FATAL_ERROR ((0, 0, _("Cannot verify stdin/stdout archive"))); @@ -408,8 +408,10 @@ open_archive (enum access_mode wanted_access) else strcpy (record_start->header.name, volume_label_option); - assign_string (¤t_stat_info.file_name, record_start->header.name); - current_stat_info.had_trailing_slash = strip_trailing_slashes (current_stat_info.file_name); + assign_string (¤t_stat_info.file_name, + record_start->header.name); + current_stat_info.had_trailing_slash = + strip_trailing_slashes (current_stat_info.file_name); record_start->header.typeflag = GNUTYPE_VOLHDR; TIME_TO_CHARS (start_time, record_start->header.mtime); @@ -703,9 +705,14 @@ flush_read (void) return; } + /* The condition below used to include + || (status > 0 && !read_full_records_option) + This is incorrect since even if new_volume() succeeds, the + subsequent call to rmtread will overwrite the chunk of data + already read in the buffer, so the processing will fail */ + if ((status == 0 - || (status < 0 && errno == ENOSPC) - || (status > 0 && !read_full_records_option)) + || (status < 0 && errno == ENOSPC)) && multi_volume_option) { union block *cursor;