Skip to content

Commit

Permalink
fix(cpio): write zeros instead of seek for padding and alignment
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
ddiss authored and Conan-Kudo committed Dec 10, 2021
1 parent 3326e4c commit 0af11c5
Showing 1 changed file with 8 additions and 2 deletions.
10 changes: 8 additions & 2 deletions src/dracut-cpio/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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/
Expand Down

0 comments on commit 0af11c5

Please sign in to comment.