[openwrt/openwrt] scripts/gen_image_generic.sh: fix order of files in EFI bootfs

LEDE Commits lede-commits at lists.infradead.org
Thu Apr 14 17:19:16 PDT 2022


dangole pushed a commit to openwrt/openwrt.git, branch master:
https://git.openwrt.org/4d289ae7e63893f90957b77962c6b60574d35441

commit 4d289ae7e63893f90957b77962c6b60574d35441
Author: Daniel Golle <daniel at makrotopia.org>
AuthorDate: Fri Apr 15 00:46:28 2022 +0100

    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 at makrotopia.org>
---
 scripts/gen_image_generic.sh | 21 +++++++++++++++++++--
 1 file 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




More information about the lede-commits mailing list