diff options
author | Christian Lamparter <chunkeey@gmail.com> | 2017-11-19 17:19:21 +0100 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2017-12-13 13:13:51 +0100 |
commit | 135aa3ba7e9d481ae78e01826fe64d73d10a0aff (patch) | |
tree | 56a6a48858d16f79a32a35713231c747fcba412d | |
parent | 207bcea1de02799b744ddca22d022456123e7566 (diff) | |
download | upstream-135aa3ba7e9d481ae78e01826fe64d73d10a0aff.tar.gz upstream-135aa3ba7e9d481ae78e01826fe64d73d10a0aff.tar.bz2 upstream-135aa3ba7e9d481ae78e01826fe64d73d10a0aff.zip |
base-files: upgrade: make get_partitions() endian agnostic
This patch fixes two issues with the current get_partitions()
function.
First: "Invalid partition table on $disk" will pop up on
legitimate images on big endian system.
This is because the little-endian representation of "55 AA" is
assumed in the context of little-endian architectures. On these
comparing it to the 16-bit word 0xAA55 does work as intented.
Whereas on big-endian systems, this would have to be 0x55AA.
This patch fixes the issue by replacing the integer conversion
and value match check with just a string comparision.
Second: The extraction of the type, start LBA and LBA num from
the partition table has the same endianness issue. This has been
fixed by using the new hex_le32_to_cpu() function. This function
will translate the stored little-endian data to the correct
byte-order if necessary.
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
(cherry picked from commit 4e3f6dae04fb526a78e613db6c65aee584403d36)
-rw-r--r-- | package/base-files/files/lib/upgrade/common.sh | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/package/base-files/files/lib/upgrade/common.sh b/package/base-files/files/lib/upgrade/common.sh index e3519ca2cb..3ddd1e7465 100644 --- a/package/base-files/files/lib/upgrade/common.sh +++ b/package/base-files/files/lib/upgrade/common.sh @@ -267,6 +267,14 @@ export_partdevice() { return 1 } +hex_le32_to_cpu() { + [ "$(echo 01 | hexdump -v -n 2 -e '/2 "%x"')" == "3031" ] && { + echo "${1:0:2}${1:8:2}${1:6:2}${1:4:2}${1:2:2}" + return + } + echo "$@" +} + get_partitions() { # <device> <filename> local disk="$1" local filename="$2" @@ -274,8 +282,8 @@ get_partitions() { # <device> <filename> if [ -b "$disk" -o -f "$disk" ]; then v "Reading partition table from $filename..." - local magic="$(hexdump -v -n 2 -s 0x1FE -e '1/2 "0x%04X"' "$disk")" - if [ "$magic" != 0xAA55 ]; then + local magic=$(dd if="$disk" bs=2 count=1 skip=255 2>/dev/null) + if [ "$magic" != $'\x55\xAA' ]; then v "Invalid partition table on $disk" exit fi @@ -286,9 +294,9 @@ get_partitions() { # <device> <filename> for part in 1 2 3 4; do set -- $(hexdump -v -n 12 -s "$((0x1B2 + $part * 16))" -e '3/4 "0x%08X "' "$disk") - local type="$(($1 % 256))" - local lba="$(($2))" - local num="$(($3))" + local type="$(( $(hex_le32_to_cpu $1) % 256))" + local lba="$(( $(hex_le32_to_cpu $2) ))" + local num="$(( $(hex_le32_to_cpu $3) ))" [ $type -gt 0 ] || continue |