mirror of
git://git.yoctoproject.org/poky.git
synced 2025-07-19 21:09:03 +02:00

This script is attempting to read binary data from an rpm file. If any of the bytes it is attempt to read is the binary value 0xa (i.e. a newline) then the script does not properly deal with this special case. Due to the behavior of command substitution, instead of fetching the value 0xa, the script makes an error and get the value 0 instead. The fix and the following explantion was taken from this post... https://unix.stackexchange.com/questions/10801/ how-to-use-bash-script-to-read-binary-file-content Command substitution $(…) strips final newlines in the command output. There's a fairly easy workaround. Make sure the output ends in a character other than a newline, then strip that one character. (From OE-Core rev: a40a93e81766513cf710e713093ab74c6ec936c3) Signed-off-by: Lori Hikichi <lori.hikichi@broadcom.com> Signed-off-by: Scott Branden <scott.branden@broadcom.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
56 lines
1.2 KiB
Bash
Executable File
56 lines
1.2 KiB
Bash
Executable File
#!/bin/sh -efu
|
|
# This file comes from rpm 4.x distribution
|
|
|
|
fatal() {
|
|
echo "$*" >&2
|
|
exit 1
|
|
}
|
|
|
|
pkg="$1"
|
|
[ -n "$pkg" -a -e "$pkg" ] ||
|
|
fatal "No package supplied"
|
|
|
|
_dd() {
|
|
local o="$1"; shift
|
|
dd if="$pkg" skip="$o" iflag=skip_bytes status=none $*
|
|
}
|
|
|
|
calcsize() {
|
|
offset=$(($1 + 8))
|
|
|
|
local i b b0 b1 b2 b3 b4 b5 b6 b7
|
|
|
|
i=0
|
|
while [ $i -lt 8 ]; do
|
|
b=$(_dd $(($offset + $i)) bs=1 count=1; echo X)
|
|
b=${b%X}
|
|
[ -z "$b" ] &&
|
|
b="0" ||
|
|
b="$(exec printf '%u\n' "'$b")"
|
|
eval "b$i=\$b"
|
|
i=$(($i + 1))
|
|
done
|
|
|
|
rsize=$((8 + ((($b0 << 24) + ($b1 << 16) + ($b2 << 8) + $b3) << 4) + ($b4 << 24) + ($b5 << 16) + ($b6 << 8) + $b7))
|
|
offset=$(($offset + $rsize))
|
|
}
|
|
|
|
case "$(_dd 0 bs=8 count=1)" in
|
|
"$(printf '\355\253\356\333')"*) ;; # '\xed\xab\xee\xdb'
|
|
*) fatal "File doesn't look like rpm: $pkg" ;;
|
|
esac
|
|
|
|
calcsize 96
|
|
sigsize=$rsize
|
|
|
|
calcsize $(($offset + (8 - ($sigsize % 8)) % 8))
|
|
hdrsize=$rsize
|
|
|
|
case "$(_dd $offset bs=3 count=1)" in
|
|
"$(printf '\102\132')"*) _dd $offset | bunzip2 ;; # '\x42\x5a'
|
|
"$(printf '\037\213')"*) _dd $offset | gunzip ;; # '\x1f\x8b'
|
|
"$(printf '\375\067')"*) _dd $offset | xzcat ;; # '\xfd\x37'
|
|
"$(printf '\135\000')"*) _dd $offset | unlzma ;; # '\x5d\x00'
|
|
*) fatal "Unrecognized rpm file: $pkg" ;;
|
|
esac
|