• Bug#1107203: unblock: initramfs-tools/0.148.1 (3/5)

    From Ben Hutchings@1:229/2 to All on Tue Jun 3 00:20:01 2025
    [continued from previous message]

    - # very roughly based on linux/lib/earlycpio.c
    - end=$start
    - while true; do
    - headoff=$end
    - magic="$(readhex "$initramfs" $end 6)" || break
    - test "$magic" = 070701 || test "$magic" = 070702 || break
    - namesize=$((0x$(readhex "$initramfs" $((end + 94)) 8))) - filesize=$((0x$(readhex "$initramfs" $((end + 54)) 8))) - nameoff=$((end + 110))
    - end=$(((nameoff + namesize + 3) & ~3))
    - end=$(((end + filesize + 3) & ~3))
    -
    - # Check for EOF marker. Note that namesize
    - # includes a null terminator.
    - if [ $namesize = 11 ] \
    - && name="$(dd if="$initramfs" bs=1 skip=$nameoff count=$((namesize - 1)) 2> /dev/null)" \
    - && [ "$name" = 'TRAILER!!!' ]; then
    - # There might be more zero padding
    - # before the next archive, so read
    - # through all of it.
    - while checkzero "$initramfs" $end; do
    - end=$((end + 4))
    - done
    - break
    - fi
    - done
    -
    - if [ $end -eq $start ]; then
    - break
    - fi
    -
    - # Check whether this should be treated as an "early"
    - # or "main" initramfs. Currently all filenames the
    - # kernel looks for in an early initramfs begin with
    - # kernel/ subdirectory, but we should never create
    - # this in the main initramfs.
    - if dd < "$initramfs" skip=$start count=$((end - start)) \
    - iflag=skip_bytes,count_bytes 2> /dev/null |
    - cpio -i --list 2> /dev/null |
    - grep -q ^kernel/; then
    - # Extract to early, early2, ... subdirectories
    - count=$((count + 1))
    - if [ $count -eq 1 ]; then
    - subdir=early
    - else
    - subdir=early$count
    - fi
    - dd < "$initramfs" skip=$start count=$((end - start)) \ - iflag=skip_bytes,count_bytes 2> /dev/null |
    - (
    - if [ -n "$dir" ]; then
    - mkdir -p -- "$dir/$subdir"
    - cd -- "$dir/$subdir"
    - fi
    - cpio -i "$@"
    - )
    - else
    - # Append to main-uncomp.cpio, excluding the
    - # trailer so cpio won't stop before the
    - # (de)compressed part.
    - dd < "$initramfs" skip=$start \
    - count=$((headoff - start)) \
    - iflag=skip_bytes,count_bytes \
    - >> "$tempdir/main-uncomp.cpio" 2> /dev/null
    - fi
    -
    - start=$end
    - done
    -
    - # Split out final archive if necessary
    - if [ "$end" -gt 0 ]; then
    - subarchive="$tempdir/main-comp.cpio"
    - dd < "$initramfs" skip="$end" iflag=skip_bytes 2> /dev/null \
    - > "$subarchive"
    - else
    - subarchive="$initramfs"
    - fi
    -
    - # If we found an early initramfs, extract main initramfs to
    - # main subdirectory. Otherwise don't use a subdirectory (for
    - # backward compatibility).
    - if [ "$count" -gt 0 ]; then
    - subdir=main
    - else
    - subdir=.
    - fi
    -
    - xcpio "$tempdir/main-uncomp.cpio" "$subarchive" \
    - "${dir:+$dir/$subdir}" -i "$@"
    -}
    -
    -OPTIONS=$(getopt -o hv --long help,list,verbose -n "$0" -- "$@") || usage_error
    -
    -cpio_opts="--preserve-modification-time --no-absolute-filenames --quiet" -expected_args=2
    -eval set -- "$OPTIONS"
    -
    -while true; do
    - case "$1" in
    - -h|--help)
    - usage
    - exit 0
    - ;;
    - --list)
    - # For lsinitramfs
    - cpio_opts="${cpio_opts:+${cpio_opts} --list}"
    - expected_args=1
    - shift
    - ;;
    - -v|--verbose)
    - cpio_opts="${cpio_opts:+${cpio_opts} --verbose}"
    - shift
    - ;;
    - --)
    - shift
    - break
    - ;;
    - *)
    - echo "Internal error!" >&2
    - exit 1
    - esac
    -done
    -
    -if [ $# -ne $expected_args ]; then
    - usage_error
    -fi
    -
    -tempdir="$(mktemp -d "${TMPDIR:-/var/tmp}/unmkinitramfs_XXXXXX")"
    -trap 'rm -rf "$tempdir"' EXIT
    -
    -# shellcheck disable=SC2086
    -splitinitramfs "$1" "${2:-}" $cpio_opts
    diff -Nru initramfs-tools-0.147/unmkinitramfs.8 initramfs-tools-0.148.1/unmkinitramfs.8
    --- initramfs-tools-0.147/unmkinitramfs.8 2025-03-25 00:52:03.000000000 +0100
    +++ initramfs-tools-0.148.1/unmkinitramfs.8 2025-05-28 20:21:18.000000000 +0200
    @@ -18,8 +18,8 @@
    and the appropriate decompressor command.

    The initramfs image may be a single compressed cpio archive, or the -concatenation of any number of uncompressed cpio archives followed by
    -a compressed cpio archive.
    +concatenation of any number of uncompressed cpio archives optionally
    +followed by a compressed cpio archive.

    When the initramfs image includes one or more "early initramfs"
    archives, that is uncompressed archives with microcode or other files
    @@ -51,8 +51,8 @@

    .SH BUGS
    .BR unmkinitramfs
    -does not support initramfs images with more or less than one
    -compressed cpio archive.
    +does not support initramfs images with more than one compressed cpio
    +archive.

    .SH AUTHOR
    The initramfs-tools are written by Maximilian Attems <[email protected]>
    diff -Nru initramfs-tools-0.147/unmkinitramfs.c initramfs-tools-