fix(cpio): write zeros instead of seek for padding and alignment
This is a workaround for GRUB2's Btrfs implementation, which doesn't correctly handle gaps between extents. A fix has already been proposed upstream via https://lists.gnu.org/archive/html/grub-devel/2021-10/msg00206.html Given that this bug is severe, it makes sense to include this minimal workaround. Signed-off-by: David Disseldorp <ddiss@suse.de>master
parent
3326e4c957
commit
0af11c5ea5
|
@ -255,7 +255,10 @@ impl ArchiveState {
|
|||
self.off += fname.len() as u64;
|
||||
// +1 as padding starts after fname nulterm
|
||||
let seeklen = 1 + archive_padlen(self.off + 1, 4);
|
||||
writer.seek(io::SeekFrom::Current(seeklen as i64))?;
|
||||
{
|
||||
let z = vec![0u8; seeklen.try_into().unwrap()];
|
||||
writer.write_all(&z)?;
|
||||
}
|
||||
self.off += seeklen;
|
||||
}
|
||||
*mapped_ino = Some((*hl).mapped_ino);
|
||||
|
@ -469,7 +472,10 @@ fn archive_path<W: Seek + Write>(
|
|||
let padding_len = archive_padlen(state.off + seek_len as u64, 4);
|
||||
seek_len += padding_len as i64;
|
||||
}
|
||||
writer.seek(io::SeekFrom::Current(seek_len))?;
|
||||
{
|
||||
let z = vec![0u8; seek_len.try_into().unwrap()];
|
||||
writer.write_all(&z)?;
|
||||
}
|
||||
state.off += seek_len as u64;
|
||||
|
||||
// io::copy() can reflink: https://github.com/rust-lang/rust/pull/75272 \o/
|
||||
|
|
Loading…
Reference in New Issue