Browse Source

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
David Disseldorp 3 years ago committed by Neal Gompa (ニール・ゴンパ)
parent
commit
0af11c5ea5
  1. 10
      src/dracut-cpio/src/main.rs

10
src/dracut-cpio/src/main.rs

@ -255,7 +255,10 @@ impl ArchiveState { @@ -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>( @@ -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…
Cancel
Save