After reviewing the very large number of changes from 1.21.4 to
1.21.22 I don't think this appropriate for an LTS release:

https://launchpad.net/debian/+source/dpkg/+changelog

Steve

On Wed, Jun 5, 2024 at 8:32 PM Yi Zhao via lists.openembedded.org
<[email protected]> wrote:
>
> ChangeLog:
> https://salsa.debian.org/dpkg-team/dpkg/-/raw/1.21.x/debian/changelog
>
> * Add new dependency libmd
> * Update SRC_URI
> * Refresh patch
> * Drop backport patch
>
> Signed-off-by: Yi Zhao <[email protected]>
> ---
>  meta/recipes-devtools/dpkg/dpkg.inc           |   4 +-
>  ...ive-Prevent-directory-traversal-for-.patch | 328 ------------------
>  ...s-expect-D-to-be-set-when-running-in.patch |  14 +-
>  .../dpkg/{dpkg_1.21.4.bb => dpkg_1.21.22.bb}  |   5 +-
>  4 files changed, 11 insertions(+), 340 deletions(-)
>  delete mode 100644 
> meta/recipes-devtools/dpkg/dpkg/0001-Dpkg-Source-Archive-Prevent-directory-traversal-for-.patch
>  rename meta/recipes-devtools/dpkg/{dpkg_1.21.4.bb => dpkg_1.21.22.bb} (86%)
>
> diff --git a/meta/recipes-devtools/dpkg/dpkg.inc 
> b/meta/recipes-devtools/dpkg/dpkg.inc
> index 0d17a98b80..b3e8c05d62 100644
> --- a/meta/recipes-devtools/dpkg/dpkg.inc
> +++ b/meta/recipes-devtools/dpkg/dpkg.inc
> @@ -4,8 +4,8 @@ HOMEPAGE = "https://salsa.debian.org/dpkg-team/dpkg";
>  DESCRIPTION = "The primary interface for the dpkg suite is the dselect 
> program. A more low-level and less user-friendly interface is available in 
> the form of the dpkg command."
>  SECTION = "base"
>
> -DEPENDS = "zlib bzip2 perl ncurses"
> -DEPENDS:class-native = "bzip2-replacement-native zlib-native 
> virtual/update-alternatives-native gettext-native perl-native"
> +DEPENDS = "zlib bzip2 perl ncurses libmd"
> +DEPENDS:class-native = "bzip2-replacement-native zlib-native 
> virtual/update-alternatives-native gettext-native perl-native libmd-native"
>  RDEPENDS:${PN} = "${VIRTUAL-RUNTIME_update-alternatives} perl"
>  RDEPENDS:${PN}:class-native = ""
>
> diff --git 
> a/meta/recipes-devtools/dpkg/dpkg/0001-Dpkg-Source-Archive-Prevent-directory-traversal-for-.patch
>  
> b/meta/recipes-devtools/dpkg/dpkg/0001-Dpkg-Source-Archive-Prevent-directory-traversal-for-.patch
> deleted file mode 100644
> index d249d854fb..0000000000
> --- 
> a/meta/recipes-devtools/dpkg/dpkg/0001-Dpkg-Source-Archive-Prevent-directory-traversal-for-.patch
> +++ /dev/null
> @@ -1,328 +0,0 @@
> -From 6d8a6799639f8853a2af1f9036bc70fddbfdd2a2 Mon Sep 17 00:00:00 2001
> -From: Guillem Jover <[email protected]>
> -Date: Tue, 3 May 2022 02:09:32 +0200
> -Subject: [PATCH] Dpkg::Source::Archive: Prevent directory traversal for
> - in-place extracts
> -
> -For untrusted v2 and v3 source package formats that include a debian.tar
> -archive, when we are extracting it, we do that as an in-place extraction,
> -which can lead to directory traversal situations on specially crafted
> -orig.tar and debian.tar tarballs.
> -
> -GNU tar replaces entries on the filesystem by the entries present on
> -the tarball, but it will follow symlinks when the symlink pathname
> -itself is not present as an actual directory on the tarball.
> -
> -This means we can create an orig.tar where there's a symlink pointing
> -out of the source tree root directory, and then a debian.tar that
> -contains an entry within that symlink as if it was a directory, without
> -a directory entry for the symlink pathname itself, which will be
> -extracted following the symlink outside the source tree root.
> -
> -This is currently noted as expected in GNU tar documentation. But even
> -if there was a new extraction mode avoiding this problem we'd need such
> -new version. Using perl's Archive::Tar would solve the problem, but
> -switching to such different pure perl implementation, could cause
> -compatibility or performance issues.
> -
> -What we do is when we are requested to perform an in-place extract, we
> -instead still use a temporary directory, then walk that directory and
> -remove any matching entry in the destination directory, replicating what
> -GNU tar would do, but in addition avoiding the directory traversal issue
> -for symlinks. Which should work with any tar implementation and be safe.
> -
> -Reported-by: Max Justicz <[email protected]>
> -Stable-Candidates: 1.18.x 1.19.x 1.20.x
> -Fixes: commit 0c0057a27fecccab77d2b3cffa9a7d172846f0b4 (1.14.17)
> -Fixes: CVE-2022-1664
> -
> -CVE: CVE-2022-1664
> -Upstream-Status: Backport [7a6c03cb34d4a09f35df2f10779cbf1b70a5200b]
> -
> -Signed-off-by: Sakib Sajal <[email protected]>
> ----
> - scripts/Dpkg/Source/Archive.pm  | 122 +++++++++++++++++++++++++-------
> - scripts/t/Dpkg_Source_Archive.t | 110 +++++++++++++++++++++++++++-
> - 2 files changed, 204 insertions(+), 28 deletions(-)
> -
> -diff --git a/scripts/Dpkg/Source/Archive.pm b/scripts/Dpkg/Source/Archive.pm
> -index 33c181b20..2ddd04af8 100644
> ---- a/scripts/Dpkg/Source/Archive.pm
> -+++ b/scripts/Dpkg/Source/Archive.pm
> -@@ -21,9 +21,11 @@ use warnings;
> - our $VERSION = '0.01';
> -
> - use Carp;
> -+use Errno qw(ENOENT);
> - use File::Temp qw(tempdir);
> - use File::Basename qw(basename);
> - use File::Spec;
> -+use File::Find;
> - use Cwd;
> -
> - use Dpkg ();
> -@@ -110,19 +112,13 @@ sub extract {
> -     my %spawn_opts = (wait_child => 1);
> -
> -     # Prepare destination
> --    my $tmp;
> --    if ($opts{in_place}) {
> --        $spawn_opts{chdir} = $dest;
> --        $tmp = $dest; # So that fixperms call works
> --    } else {
> --        my $template = basename($self->get_filename()) .  
> '.tmp-extract.XXXXX';
> --        unless (-e $dest) {
> --            # Kludge so that realpath works
> --            mkdir($dest) or syserr(g_('cannot create directory %s'), $dest);
> --        }
> --        $tmp = tempdir($template, DIR => Cwd::realpath("$dest/.."), CLEANUP 
> => 1);
> --        $spawn_opts{chdir} = $tmp;
> -+    my $template = basename($self->get_filename()) .  '.tmp-extract.XXXXX';
> -+    unless (-e $dest) {
> -+        # Kludge so that realpath works
> -+        mkdir($dest) or syserr(g_('cannot create directory %s'), $dest);
> -     }
> -+    my $tmp = tempdir($template, DIR => Cwd::realpath("$dest/.."), CLEANUP 
> => 1);
> -+    $spawn_opts{chdir} = $tmp;
> -
> -     # Prepare stuff that handles the input of tar
> -     $self->ensure_open('r', delete_sig => [ 'PIPE' ]);
> -@@ -145,22 +141,94 @@ sub extract {
> -     # have to be calculated using mount options and other madness.
> -     fixperms($tmp) unless $opts{no_fixperms};
> -
> --    # Stop here if we extracted in-place as there's nothing to move around
> --    return if $opts{in_place};
> --
> --    # Rename extracted directory
> --    opendir(my $dir_dh, $tmp) or syserr(g_('cannot opendir %s'), $tmp);
> --    my @entries = grep { $_ ne '.' && $_ ne '..' } readdir($dir_dh);
> --    closedir($dir_dh);
> --    my $done = 0;
> --    erasedir($dest);
> --    if (scalar(@entries) == 1 && ! -l "$tmp/$entries[0]" && -d _) {
> --      rename("$tmp/$entries[0]", $dest)
> --          or syserr(g_('unable to rename %s to %s'),
> --                    "$tmp/$entries[0]", $dest);
> -+    # If we are extracting "in-place" do not remove the destination 
> directory.
> -+    if ($opts{in_place}) {
> -+        my $canon_basedir = Cwd::realpath($dest);
> -+        # On Solaris /dev/null points to /devices/pseudo/mm@0:null.
> -+        my $canon_devnull = Cwd::realpath('/dev/null');
> -+        my $check_symlink = sub {
> -+            my $pathname = shift;
> -+            my $canon_pathname = Cwd::realpath($pathname);
> -+            if (not defined $canon_pathname) {
> -+                return if $! == ENOENT;
> -+
> -+                syserr(g_("pathname '%s' cannot be canonicalized"), 
> $pathname);
> -+            }
> -+            return if $canon_pathname eq $canon_devnull;
> -+            return if $canon_pathname eq $canon_basedir;
> -+            return if $canon_pathname =~ m{^\Q$canon_basedir/\E};
> -+            warning(g_("pathname '%s' points outside source root (to 
> '%s')"),
> -+                    $pathname, $canon_pathname);
> -+        };
> -+
> -+        my $move_in_place = sub {
> -+            my $relpath = File::Spec->abs2rel($File::Find::name, $tmp);
> -+            my $destpath = File::Spec->catfile($dest, $relpath);
> -+
> -+            my ($mode, $atime, $mtime);
> -+            lstat $File::Find::name
> -+                or syserr(g_('cannot get source pathname %s metadata'), 
> $File::Find::name);
> -+            ((undef) x 2, $mode, (undef) x 5, $atime, $mtime) = lstat _;
> -+            my $src_is_dir = -d _;
> -+
> -+            my $dest_exists = 1;
> -+            if (not lstat $destpath) {
> -+                if ($! == ENOENT) {
> -+                    $dest_exists = 0;
> -+                } else {
> -+                    syserr(g_('cannot get target pathname %s metadata'), 
> $destpath);
> -+                }
> -+            }
> -+            my $dest_is_dir = -d _;
> -+            if ($dest_exists) {
> -+                if ($dest_is_dir && $src_is_dir) {
> -+                    # Refresh the destination directory attributes with the
> -+                    # ones from the tarball.
> -+                    chmod $mode, $destpath
> -+                        or syserr(g_('cannot change directory %s mode'), 
> $File::Find::name);
> -+                    utime $atime, $mtime, $destpath
> -+                        or syserr(g_('cannot change directory %s times'), 
> $File::Find::name);
> -+
> -+                    # We should do nothing, and just walk further tree.
> -+                    return;
> -+                } elsif ($dest_is_dir) {
> -+                    rmdir $destpath
> -+                        or syserr(g_('cannot remove destination directory 
> %s'), $destpath);
> -+                } else {
> -+                    $check_symlink->($destpath);
> -+                    unlink $destpath
> -+                        or syserr(g_('cannot remove destination file %s'), 
> $destpath);
> -+                }
> -+            }
> -+            # If we are moving a directory, we do not need to walk it.
> -+            if ($src_is_dir) {
> -+                $File::Find::prune = 1;
> -+            }
> -+            rename $File::Find::name, $destpath
> -+                or syserr(g_('cannot move %s to %s'), $File::Find::name, 
> $destpath);
> -+        };
> -+
> -+        find({
> -+            wanted => $move_in_place,
> -+            no_chdir => 1,
> -+            dangling_symlinks => 0,
> -+        }, $tmp);
> -     } else {
> --      rename($tmp, $dest)
> --          or syserr(g_('unable to rename %s to %s'), $tmp, $dest);
> -+        # Rename extracted directory
> -+        opendir(my $dir_dh, $tmp) or syserr(g_('cannot opendir %s'), $tmp);
> -+        my @entries = grep { $_ ne '.' && $_ ne '..' } readdir($dir_dh);
> -+        closedir($dir_dh);
> -+
> -+        erasedir($dest);
> -+
> -+        if (scalar(@entries) == 1 && ! -l "$tmp/$entries[0]" && -d _) {
> -+            rename("$tmp/$entries[0]", $dest)
> -+                or syserr(g_('unable to rename %s to %s'),
> -+                          "$tmp/$entries[0]", $dest);
> -+        } else {
> -+            rename($tmp, $dest)
> -+                or syserr(g_('unable to rename %s to %s'), $tmp, $dest);
> -+        }
> -     }
> -     erasedir($tmp);
> - }
> -diff --git a/scripts/t/Dpkg_Source_Archive.t 
> b/scripts/t/Dpkg_Source_Archive.t
> -index 7b70da68e..504fbe1d4 100644
> ---- a/scripts/t/Dpkg_Source_Archive.t
> -+++ b/scripts/t/Dpkg_Source_Archive.t
> -@@ -16,12 +16,120 @@
> - use strict;
> - use warnings;
> -
> --use Test::More tests => 1;
> -+use Test::More tests => 4;
> -+use Test::Dpkg qw(:paths);
> -+
> -+use File::Spec;
> -+use File::Path qw(make_path rmtree);
> -
> - BEGIN {
> -     use_ok('Dpkg::Source::Archive');
> - }
> -
> -+use Dpkg;
> -+
> -+my $tmpdir = test_get_temp_path();
> -+
> -+rmtree($tmpdir);
> -+
> -+sub test_touch
> -+{
> -+    my ($name, $data) = @_;
> -+
> -+    open my $fh, '>', $name
> -+        or die "cannot touch file $name\n";
> -+    print { $fh } $data if $data;
> -+    close $fh;
> -+}
> -+
> -+sub test_path_escape
> -+{
> -+    my $name = shift;
> -+
> -+    my $treedir = File::Spec->rel2abs("$tmpdir/$name-tree");
> -+    my $overdir = File::Spec->rel2abs("$tmpdir/$name-overlay");
> -+    my $outdir = "$tmpdir/$name-out";
> -+    my $expdir = "$tmpdir/$name-exp";
> -+
> -+    # This is the base directory, where we are going to be extracting stuff
> -+    # into, which include traps.
> -+    make_path("$treedir/subdir-a");
> -+    test_touch("$treedir/subdir-a/file-a");
> -+    test_touch("$treedir/subdir-a/file-pre-a");
> -+    make_path("$treedir/subdir-b");
> -+    test_touch("$treedir/subdir-b/file-b");
> -+    test_touch("$treedir/subdir-b/file-pre-b");
> -+    symlink File::Spec->abs2rel($outdir, $treedir), 
> "$treedir/symlink-escape";
> -+    symlink File::Spec->abs2rel("$outdir/nonexistent", $treedir), 
> "$treedir/symlink-nonexistent";
> -+    symlink "$treedir/file", "$treedir/symlink-within";
> -+    test_touch("$treedir/supposed-dir");
> -+
> -+    # This is the overlay directory, which we'll pack and extract over the
> -+    # base directory.
> -+    make_path($overdir);
> -+    make_path("$overdir/subdir-a/aa");
> -+    test_touch("$overdir/subdir-a/aa/file-aa", 'aa');
> -+    test_touch("$overdir/subdir-a/file-a", 'a');
> -+    make_path("$overdir/subdir-b/bb");
> -+    test_touch("$overdir/subdir-b/bb/file-bb", 'bb');
> -+    test_touch("$overdir/subdir-b/file-b", 'b');
> -+    make_path("$overdir/symlink-escape");
> -+    test_touch("$overdir/symlink-escape/escaped-file", 'escaped');
> -+    test_touch("$overdir/symlink-nonexistent", 'nonexistent');
> -+    make_path("$overdir/symlink-within");
> -+    make_path("$overdir/supposed-dir");
> -+    test_touch("$overdir/supposed-dir/supposed-file", 'something');
> -+
> -+    # Generate overlay tar.
> -+    system($Dpkg::PROGTAR, '-cf', "$overdir.tar", '-C', $overdir, qw(
> -+        subdir-a subdir-b
> -+        symlink-escape/escaped-file symlink-nonexistent symlink-within
> -+        supposed-dir
> -+        )) == 0
> -+        or die "cannot create overlay tar archive\n";
> -+
> -+   # This is the expected directory, which we'll be comparing against.
> -+    make_path($expdir);
> -+    system('cp', '-a', $overdir, $expdir) == 0
> -+        or die "cannot copy overlay hierarchy into expected directory\n";
> -+
> -+    # Store the expected and out reference directories into a tar to compare
> -+    # its structure against the result reference.
> -+    system($Dpkg::PROGTAR, '-cf', "$expdir.tar", '-C', $overdir, qw(
> -+        subdir-a subdir-b
> -+        symlink-escape/escaped-file symlink-nonexistent symlink-within
> -+        supposed-dir
> -+        ), '-C', $treedir, qw(
> -+        subdir-a/file-pre-a
> -+        subdir-b/file-pre-b
> -+        )) == 0
> -+        or die "cannot create expected tar archive\n";
> -+
> -+    # This directory is supposed to remain empty, anything inside implies a
> -+    # directory traversal.
> -+    make_path($outdir);
> -+
> -+    my $warnseen;
> -+    local $SIG{__WARN__} = sub { $warnseen = $_[0] };
> -+
> -+    # Perform the extraction.
> -+    my $tar = Dpkg::Source::Archive->new(filename => "$overdir.tar");
> -+    $tar->extract($treedir, in_place => 1);
> -+
> -+    # Store the result into a tar to compare its structure against a 
> reference.
> -+    system($Dpkg::PROGTAR, '-cf', "$treedir.tar", '-C', $treedir, '.');
> -+
> -+    # Check results
> -+    ok(length $warnseen && $warnseen =~ m/points outside source root/,
> -+       'expected warning seen');
> -+    ok(system($Dpkg::PROGTAR, '--compare', '-f', "$expdir.tar", '-C', 
> $treedir) == 0,
> -+       'expected directory matches');
> -+    ok(! -e "$outdir/escaped-file",
> -+       'expected output directory is empty, directory traversal');
> -+}
> -+
> -+test_path_escape('in-place');
> -+
> - # TODO: Add actual test cases.
> -
> - 1;
> ---
> -2.33.0
> -
> diff --git 
> a/meta/recipes-devtools/dpkg/dpkg/0003-Our-pre-postinsts-expect-D-to-be-set-when-running-in.patch
>  
> b/meta/recipes-devtools/dpkg/dpkg/0003-Our-pre-postinsts-expect-D-to-be-set-when-running-in.patch
> index 75ae848264..5e52427caf 100644
> --- 
> a/meta/recipes-devtools/dpkg/dpkg/0003-Our-pre-postinsts-expect-D-to-be-set-when-running-in.patch
> +++ 
> b/meta/recipes-devtools/dpkg/dpkg/0003-Our-pre-postinsts-expect-D-to-be-set-when-running-in.patch
> @@ -1,4 +1,4 @@
> -From dd11ed66640f79143e42d778b58fdd5a61fb5836 Mon Sep 17 00:00:00 2001
> +From 115fed94be9c61d2a8de21e7d169b5872e9ebd09 Mon Sep 17 00:00:00 2001
>  From: Alexander Kanavin <[email protected]>
>  Date: Wed, 26 Aug 2015 16:25:45 +0300
>  Subject: [PATCH] Our pre/postinsts expect $D to be set when running in a
> @@ -12,21 +12,21 @@ ALIMON 2016/05/26
>  ALIMON 2017/02/21
>  KKang 2019/02/20
>  ---
> - src/main/script.c | 54 +++--------------------------------------------
> - 1 file changed, 3 insertions(+), 51 deletions(-)
> + src/main/script.c | 53 +++--------------------------------------------
> + 1 file changed, 3 insertions(+), 50 deletions(-)
>
>  diff --git a/src/main/script.c b/src/main/script.c
> -index abe65b6..0edb8f1 100644
> +index b4f369dfa..559a49cc5 100644
>  --- a/src/main/script.c
>  +++ b/src/main/script.c
> -@@ -96,58 +96,10 @@ setexecute(const char *path, struct stat *stab)
> - static const char *
> +@@ -97,58 +97,11 @@ static const char *
>   maintscript_pre_exec(struct command *cmd)
>   {
> +       const char *instdir = dpkg_fsys_get_dir();
>  -      const char *admindir = dpkg_db_get_dir();
>  -      const char *changedir;
>  -      size_t instdirlen = strlen(instdir);
> --
> +
>  -      if (instdirlen > 0 && in_force(FORCE_SCRIPT_CHROOTLESS))
>  -              changedir = instdir;
>  -      else
> diff --git a/meta/recipes-devtools/dpkg/dpkg_1.21.4.bb 
> b/meta/recipes-devtools/dpkg/dpkg_1.21.22.bb
> similarity index 86%
> rename from meta/recipes-devtools/dpkg/dpkg_1.21.4.bb
> rename to meta/recipes-devtools/dpkg/dpkg_1.21.22.bb
> index 7ef6233ee4..04bcc93321 100644
> --- a/meta/recipes-devtools/dpkg/dpkg_1.21.4.bb
> +++ b/meta/recipes-devtools/dpkg/dpkg_1.21.22.bb
> @@ -1,7 +1,7 @@
>  require dpkg.inc
>  LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe"
>
> -SRC_URI = 
> "git://salsa.debian.org/dpkg-team/dpkg.git;protocol=https;branch=main \
> +SRC_URI = 
> "git://salsa.debian.org/dpkg-team/dpkg.git;protocol=https;branch=1.21.x \
>             file://noman.patch \
>             file://remove-tar-no-timestamp.patch \
>             file://arch_pm.patch \
> @@ -14,11 +14,10 @@ SRC_URI = 
> "git://salsa.debian.org/dpkg-team/dpkg.git;protocol=https;branch=main
>             file://0001-dpkg-Support-muslx32-build.patch \
>             file://pager.patch \
>             file://0001-Add-support-for-riscv32-CPU.patch \
> -           
> file://0001-Dpkg-Source-Archive-Prevent-directory-traversal-for-.patch \
>             "
>
>  SRC_URI:append:class-native = " 
> file://0001-build.c-ignore-return-of-1-from-tar-cf.patch"
>
> -SRCREV = "5563bdb608b3413639b69f1c76567cb66ff1a961"
> +SRCREV = "48482e4f16467e05a08aa3b3b8048e08f0024609"
>
>  S = "${WORKDIR}/git"
> --
> 2.25.1
>
>
> 
>
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#200400): 
https://lists.openembedded.org/g/openembedded-core/message/200400
Mute This Topic: https://lists.openembedded.org/mt/106517331/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to