~ubuntu-branches/ubuntu/raring/devscripts/raring-security

« back to all changes in this revision

Viewing changes to scripts/uscan.pl

  • Committer: Package Import Robot
  • Author(s): Marc Deslauriers
  • Date: 2014-01-10 12:46:09 UTC
  • Revision ID: package-import@ubuntu.com-20140110124609-9z9mnkfqtstud61e
Tags: 2.13.1ubuntu0.1
* SECURITY UPDATE: arbitrary code execution in uscan via crafted tarball
  - scripts/uscan.pl: improve tarball handling.
  - 02c6850d973e3e1246fde72edab27f03d63acc52
  - 4b7e58ee6000cdefac0682601cec6ecce0137467
  - CVE-2013-6888

Show diffs side-by-side

added added

removed removed

Lines of Context:
1403
1403
          or die("unzip binary not found. You need to install the package unzip to be able to repack .zip upstream archives.\n");
1404
1404
 
1405
1405
        my $newfile_base_gz = "$1.tar.gz";
1406
 
        my $tempdir = tempdir ( "uscanXXXX", TMPDIR => 1, CLEANUP => 1 );
1407
 
        my $globpattern = "*";
1408
 
        my $hidden = ".[!.]*";
 
1406
        my $tempdir = tempdir ("uscanXXXX", TMPDIR => 1, CLEANUP => 1);
 
1407
        # Parent of the target directory should be under our control
 
1408
        $tempdir .= '/repack';
 
1409
        mkdir $tempdir or die("Unable to mkdir($tempdir): $!\n");
1409
1410
        my $absdestdir = abs_path($destdir);
1410
1411
        system('unzip', '-q', '-a', '-d', $tempdir, "$destdir/$newfile_base") == 0
1411
 
          or die("Repacking from zip to tar.gz failed (could not unzip)\n");
1412
 
        if (defined glob("$tempdir/$hidden")) {
1413
 
            $globpattern .= " $hidden";
 
1412
            or die("Repacking from zip to tar.gz failed (could not unzip)\n");
 
1413
        my $cwd = cwd();
 
1414
        chdir($tempdir) or die("Unable to chdir($tempdir): $!\n");
 
1415
        eval {
 
1416
            spawn(exec => ['tar', '--owner=root', '--group=root', '--mode=a+rX', '-czf', "$absdestdir/$newfile_base_gz", glob('* .[!.]*')],
 
1417
                  env => { GZIP => '-n -9' },
 
1418
                  wait_child => 1);
 
1419
        };
 
1420
        if ($@) {
 
1421
            die("Repacking from zip to tar.gz failed (could not create tarball)\n");
1414
1422
        }
1415
 
        system("cd $tempdir; GZIP='-n -9' tar --owner=root --group=root --mode=a+rX -czf \"$absdestdir/$newfile_base_gz\" $globpattern") == 0
1416
 
          or die("Repacking from zip to tar.gz failed (could not create tarball)\n");
 
1423
        chdir($cwd);
1417
1424
        unlink "$destdir/$newfile_base";
1418
1425
        $newfile_base = $newfile_base_gz;
1419
1426
    }
1422
1429
                             |tar\.bz2|tbz2?
1423
1430
                             |tar.lzma|tlz(?:ma?)?
1424
1431
                             |tar.xz|txz)$/x) {
1425
 
        my $filetype = `file -b -k \"$destdir/$newfile_base\"`;
1426
 
        unless ($filetype =~ /compressed data/) {
 
1432
        my $filetype;
 
1433
        eval {
 
1434
            spawn(exec => ['file', '-b', '-k', "$destdir/$newfile_base"],
 
1435
                  to_string => \$filetype,
 
1436
                  wait_child => 1);
 
1437
        };
 
1438
        unless (defined $filetype && $filetype =~ /compressed data/) {
1427
1439
            warn "$progname warning: $destdir/$newfile_base does not appear to be a compressed file;\nthe file command says: $filetype\nNot processing this file any further!\n";
1428
1440
            return 1;
1429
1441
        }