From 2aa37b1e612e040ce9a661b4e016dc4bb6bd0b08 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Mon, 7 Nov 2016 23:12:42 +0000 Subject: [PATCH] Cope when an orig tarball is a tarbomb. Ie, if it contains other than one single directory toplevel. Closes:#843422. Specifically: * We change the unpack directory to _unpack-tar in unpack, rather than ../unpack-tar. This means that mktree_in_ud DTRT in that directory, rather than in its supposed only subdiredctory * We do write-tree on the whole tarball. * Then if the tarball had only one subdir in it, we fish the subtree's tree object out of the git tree object. Signed-off-by: Ian Jackson --- debian/changelog | 2 ++ dgit | 26 ++++++++++++++++++-------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/debian/changelog b/debian/changelog index 691b783d..41f2796c 100644 --- a/debian/changelog +++ b/debian/changelog @@ -12,6 +12,8 @@ dgit (2.10~) unstable; urgency=medium so that users can easily track "jessie, or jessie-security". * Fix an unconditional print that was supposed to be a printdebug: origs .orig.tar.gz f.same=1 #f._differ=-1 + * Cope when an orig tarball is a tarbomb. Ie, if it contains + other than one single directory toplevel. Closes:#843422. -- diff --git a/dgit b/dgit index 89795013..4f54379e 100755 --- a/dgit +++ b/dgit @@ -2128,14 +2128,14 @@ sub generate_commits_from_dsc () { $input = $compr_fh; } - rmtree "../unpack-tar"; - mkdir "../unpack-tar" or die $!; + rmtree "_unpack-tar"; + mkdir "_unpack-tar" or die $!; my @tarcmd = qw(tar -x -f - --no-same-owner --no-same-permissions --no-acls --no-xattrs --no-selinux); my $tar_pid = fork // die $!; if (!$tar_pid) { - chdir "../unpack-tar" or die $!; + chdir "_unpack-tar" or die $!; open STDIN, "<&", $input or die $!; exec @tarcmd; die "dgit (child): exec $tarcmd[0]: $!"; @@ -2149,11 +2149,21 @@ sub generate_commits_from_dsc () { # finally, we have the results in "tarball", but maybe # with the wrong permissions - runcmd qw(chmod -R +rwX ../unpack-tar); - changedir "../unpack-tar"; - my ($tree) = mktree_in_ud_from_only_subdir(1); - changedir "../../unpack"; - rmtree "../unpack-tar"; + runcmd qw(chmod -R +rwX _unpack-tar); + changedir "_unpack-tar"; + remove_stray_gits(); + mktree_in_ud_here(); + + my ($tree) = git_add_write_tree(); + my $tentries = cmdoutput @git, qw(ls-tree -z), $tree; + if ($tentries =~ m/^\d+ tree (\w+)\t[^\000]+\000$/s) { + $tree = $1; + printdebug "one subtree $1\n"; + } else { + printdebug "multiple subtrees\n"; + } + changedir ".."; + rmtree "_unpack-tar"; my $ent = [ $f, $tree ]; push @tartrees, { -- 2.30.2