aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Golle <daniel@makrotopia.org>2022-04-15 00:46:28 +0100
committerDaniel Golle <daniel@makrotopia.org>2022-04-15 14:12:13 +0100
commit3e16ed30638762cbffc2bb94514a62239ce2a66b (patch)
tree3244f8cbf66bee6f00dda5f67282a32c68863909
parent7ea412ef5a2871bb42136f914206e15b8cae04e1 (diff)
downloadupstream-3e16ed30638762cbffc2bb94514a62239ce2a66b.tar.gz
upstream-3e16ed30638762cbffc2bb94514a62239ce2a66b.tar.bz2
upstream-3e16ed30638762cbffc2bb94514a62239ce2a66b.zip
scripts/gen_image_generic.sh: fix order of files in EFI bootfs
mtools recursive copy (mcopy -s ...) is using READDIR(3) to iterate over the directory entries, hence they end up in the FAT filesystem in traversal order which breaks reproducibility (rather than being added to the FAT filesystem in a reproducible order). Implement recursive copy in gen_image_generic.sh in Shell code instead, as in that way we can force files to be copied in reproducible order. Fixes: aece8f5ae8 ("scripts/gen_image_generic.sh: generate reproducible EFI filesystem") Signed-off-by: Daniel Golle <daniel@makrotopia.org> (cherry picked from commit 4d289ae7e63893f90957b77962c6b60574d35441)
-rwxr-xr-xscripts/gen_image_generic.sh21
1 files changed, 19 insertions, 2 deletions
diff --git a/scripts/gen_image_generic.sh b/scripts/gen_image_generic.sh
index 5e37224736..ef13624402 100755
--- a/scripts/gen_image_generic.sh
+++ b/scripts/gen_image_generic.sh
@@ -26,14 +26,31 @@ KERNELSIZE="$2"
ROOTFSOFFSET="$(($3 / 512))"
ROOTFSSIZE="$(($4 / 512))"
+# Using mcopy -s ... is using READDIR(3) to iterate through the directory
+# entries, hence they end up in the FAT filesystem in traversal order which
+# breaks reproducibility.
+# Implement recursive copy with reproducible order.
+dos_dircopy() {
+ local entry
+ local baseentry
+ for entry in "$1"/* ; do
+ if [ -f "$entry" ]; then
+ mcopy -i "$OUTPUT.kernel" "$entry" ::"$2"
+ elif [ -d "$entry" ]; then
+ baseentry="$(basename "$entry")"
+ mmd -i "$OUTPUT.kernel" ::"$2""$baseentry"
+ dos_dircopy "$entry" "$2""$baseentry"/
+ fi
+ done
+}
+
[ -n "$PADDING" ] && dd if=/dev/zero of="$OUTPUT" bs=512 seek="$ROOTFSOFFSET" conv=notrunc count="$ROOTFSSIZE"
dd if="$ROOTFSIMAGE" of="$OUTPUT" bs=512 seek="$ROOTFSOFFSET" conv=notrunc
if [ -n "$GUID" ]; then
[ -n "$PADDING" ] && dd if=/dev/zero of="$OUTPUT" bs=512 seek="$((ROOTFSOFFSET + ROOTFSSIZE))" conv=notrunc count="$sect"
mkfs.fat --invariant -n kernel -C "$OUTPUT.kernel" -S 512 "$((KERNELSIZE / 1024))"
- [ "$SOURCE_DATE_EPOCH" ] && find "$KERNELDIR"/ -mindepth 1 -execdir touch -hcd "@${SOURCE_DATE_EPOCH}" "{}" +
- LC_ALL=C mcopy -m -s -i "$OUTPUT.kernel" "$KERNELDIR"/* ::/
+ LC_ALL=C dos_dircopy "$KERNELDIR" /
else
make_ext4fs -J -L kernel -l "$KERNELSIZE" ${SOURCE_DATE_EPOCH:+-T ${SOURCE_DATE_EPOCH}} "$OUTPUT.kernel" "$KERNELDIR"
fi