]> git.ipfire.org Git - thirdparty/dracut.git/commitdiff
fix(cpio): write zeros instead of seek for padding and alignment
authorDavid Disseldorp <ddiss@suse.de>
Fri, 3 Dec 2021 12:44:34 +0000 (13:44 +0100)
committerNeal Gompa (ニール・ゴンパ) <ngompa13@gmail.com>
Fri, 10 Dec 2021 13:06:40 +0000 (08:06 -0500)
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>
src/dracut-cpio/src/main.rs

index f1562e557fa5cadcdd3c2a8b693a7337f829182c..1c622c404dd196fd98a0c908465e247ed2528d4f 100644 (file)
@@ -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/