diff mbox series

[v2,1/2] rpm2cpio.sh: update to the last 4.x version

Message ID 20230615105447.29690-1-aplanas@suse.com
State New
Headers show
Series [v2,1/2] rpm2cpio.sh: update to the last 4.x version | expand

Commit Message

Alberto Planas Dominguez June 15, 2023, 10:54 a.m. UTC
From: Alberto Planas <aplanas@suse.com>

openSUSE RPMs are compressing the RPM payload using zstd, that
correspond to the magic ID 0x28, 0xb5, 0x2f.

This patch update the script to the last version from the rpm project,
and add support to this compression format, and extract the cpio payload
using the "unzstd" binary.

Signed-off-by: Alberto Planas <aplanas@suse.com>
---
 scripts/rpm2cpio.sh | 30 ++++++++++++++++++++----------
 1 file changed, 20 insertions(+), 10 deletions(-)
 mode change 100755 => 100644 scripts/rpm2cpio.sh

Comments

Khem Raj June 18, 2023, 5:10 p.m. UTC | #1
I am seeing some race condition see

https://errors.yoctoproject.org/Errors/Details/708923/

On Thu, Jun 15, 2023 at 3:55 AM Alberto Planas via
lists.openembedded.org <aplanas=suse.com@lists.openembedded.org>
wrote:
>
> From: Alberto Planas <aplanas@suse.com>
>
> openSUSE RPMs are compressing the RPM payload using zstd, that
> correspond to the magic ID 0x28, 0xb5, 0x2f.
>
> This patch update the script to the last version from the rpm project,
> and add support to this compression format, and extract the cpio payload
> using the "unzstd" binary.
>
> Signed-off-by: Alberto Planas <aplanas@suse.com>
> ---
>  scripts/rpm2cpio.sh | 30 ++++++++++++++++++++----------
>  1 file changed, 20 insertions(+), 10 deletions(-)
>  mode change 100755 => 100644 scripts/rpm2cpio.sh
>
> diff --git a/scripts/rpm2cpio.sh b/scripts/rpm2cpio.sh
> old mode 100755
> new mode 100644
> index 2034373fe4..8199b43784
> --- a/scripts/rpm2cpio.sh
> +++ b/scripts/rpm2cpio.sh
> @@ -7,7 +7,7 @@ fatal() {
>  }
>
>  pkg="$1"
> -[ -n "$pkg" -a -e "$pkg" ] ||
> +[ -n "$pkg" ] && [ -e "$pkg" ] ||
>         fatal "No package supplied"
>
>  _dd() {
> @@ -16,14 +16,23 @@ _dd() {
>  }
>
>  calcsize() {
> +
> +       case "$(_dd $1 bs=4 count=1 | tr -d '\0')" in
> +               "$(printf '\216\255\350')"*) ;; # '\x8e\xad\xe8'
> +               *) fatal "File doesn't look like rpm: $pkg" ;;
> +       esac
> +
>         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}
> +               # add . to not loose \n
> +               # strip \0 as it gets dropped with warning otherwise
> +               b="$(_dd $(($offset + $i)) bs=1 count=1 | tr -d '\0' ; echo .)"
> +               b=${b%.}    # strip . again
> +
>                 [ -z "$b" ] &&
>                         b="0" ||
>                         b="$(exec printf '%u\n' "'$b")"
> @@ -35,7 +44,7 @@ calcsize() {
>         offset=$(($offset + $rsize))
>  }
>
> -case "$(_dd 0 bs=8 count=1)" in
> +case "$(_dd 0 bs=4 count=1 | tr -d '\0')" in
>         "$(printf '\355\253\356\333')"*) ;; # '\xed\xab\xee\xdb'
>         *) fatal "File doesn't look like rpm: $pkg" ;;
>  esac
> @@ -46,10 +55,11 @@ sigsize=$rsize
>  calcsize $(($offset + (8 - ($sigsize % 8)) % 8))
>  hdrsize=$rsize
>
> -case "$(_dd $offset bs=3 count=1)" in
> -       "$(printf '\102\132')"*) _dd $offset | bzip2 -d ;; # '\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" ;;
> +case "$(_dd $offset bs=2 count=1 | tr -d '\0')" 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')") _dd $offset | unlzma      ;; # '\x5d\x00'
> +       "$(printf '\050\265')") _dd $offset | unzstd  ;; # '\x28\xb5'
> +       *) fatal "Unrecognized payload compression format in rpm file: $pkg" ;;
>  esac
> --
> 2.41.0
>
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#182844): https://lists.openembedded.org/g/openembedded-core/message/182844
> Mute This Topic: https://lists.openembedded.org/mt/99546092/1997914
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [raj.khem@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
Alberto Planas Dominguez June 19, 2023, 6:45 a.m. UTC | #2
From: Khem Raj <raj.khem@gmail.com>
 
> I am seeing some race condition see
> https://errors.yoctoproject.org/Errors/Details/708923/

Confirmed. It is the second time that I do the same mistake. I hope v3 finally fix it.
diff mbox series

Patch

diff --git a/scripts/rpm2cpio.sh b/scripts/rpm2cpio.sh
old mode 100755
new mode 100644
index 2034373fe4..8199b43784
--- a/scripts/rpm2cpio.sh
+++ b/scripts/rpm2cpio.sh
@@ -7,7 +7,7 @@  fatal() {
 }
 
 pkg="$1"
-[ -n "$pkg" -a -e "$pkg" ] ||
+[ -n "$pkg" ] && [ -e "$pkg" ] ||
 	fatal "No package supplied"
 
 _dd() {
@@ -16,14 +16,23 @@  _dd() {
 }
 
 calcsize() {
+
+	case "$(_dd $1 bs=4 count=1 | tr -d '\0')" in
+		"$(printf '\216\255\350')"*) ;; # '\x8e\xad\xe8'
+		*) fatal "File doesn't look like rpm: $pkg" ;;
+	esac
+
 	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}
+		# add . to not loose \n
+		# strip \0 as it gets dropped with warning otherwise
+		b="$(_dd $(($offset + $i)) bs=1 count=1 | tr -d '\0' ; echo .)"
+		b=${b%.}    # strip . again
+
 		[ -z "$b" ] &&
 			b="0" ||
 			b="$(exec printf '%u\n' "'$b")"
@@ -35,7 +44,7 @@  calcsize() {
 	offset=$(($offset + $rsize))
 }
 
-case "$(_dd 0 bs=8 count=1)" in
+case "$(_dd 0 bs=4 count=1 | tr -d '\0')" in
 	"$(printf '\355\253\356\333')"*) ;; # '\xed\xab\xee\xdb'
 	*) fatal "File doesn't look like rpm: $pkg" ;;
 esac
@@ -46,10 +55,11 @@  sigsize=$rsize
 calcsize $(($offset + (8 - ($sigsize % 8)) % 8))
 hdrsize=$rsize
 
-case "$(_dd $offset bs=3 count=1)" in
-	"$(printf '\102\132')"*) _dd $offset | bzip2 -d ;; # '\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" ;;
+case "$(_dd $offset bs=2 count=1 | tr -d '\0')" 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')") _dd $offset | unlzma      ;; # '\x5d\x00'
+	"$(printf '\050\265')") _dd $offset | unzstd  ;; # '\x28\xb5'
+	*) fatal "Unrecognized payload compression format in rpm file: $pkg" ;;
 esac