@@ -387,7 +387,7 @@ sub fetch_gbininfo {
387
387
my $packagebinaryversionlist = PBuild::Structured::fromxml($data , $dtd_packagebinaryversionlist , 0, 1);
388
388
my $gbininfo = {};
389
389
for my $binaryversionlist (@{$packagebinaryversionlist -> {' binaryversionlist' } || []}) {
390
- my $location = " ${baseurl} build/$prp /$arch /$binaryversionlist ->{'package'}/" ;
390
+ my $location = " ${baseurl} build/$prp /$arch /" .PBuild::Util::urlencode( " $binaryversionlist ->{'package'}/" ) ;
391
391
my %bins ;
392
392
for my $binary (@{$binaryversionlist -> {' binary' } || []}) {
393
393
my $filename = $binary -> {' name' };
@@ -407,7 +407,11 @@ sub fetch_gbininfo {
407
407
$bin -> {' hdrmd5' } = $binary -> {' hdrmd5' } if $binary -> {' hdrmd5' };
408
408
$bin -> {' leadsigmd5' } = $binary -> {' leadsigmd5' } if $binary -> {' leadsigmd5' };
409
409
$bin -> {' md5sum' } = $binary -> {' md5sum' } if $binary -> {' md5sum' };
410
- $bin -> {' location' } = $location . $filename ;
410
+ if ($filename =~ / ([\000 -\040 <>;\" #\? &\+ =%[\177 -\377 ])/s ) {
411
+ $bin -> {' location' } = $location . PBuild::Util::urlencode($filename );
412
+ } else {
413
+ $bin -> {' location' } = $location . $filename ;
414
+ }
411
415
$bins {$filename } = $bin ;
412
416
}
413
417
$gbininfo -> {$binaryversionlist -> {' package' }} = \%bins ;
@@ -435,46 +439,35 @@ sub fetch_gbininfo_cookie {
435
439
}
436
440
437
441
sub fetch_productbinaries_cpioextract {
438
- my ($ent , $xfile , $repodir , $packid , $files ) = @_ ;
442
+ my ($ent , $xfile , $repodir , $packid , $files , $callback ) = @_ ;
439
443
return undef unless $ent -> {' cpiotype' } == 8;
440
444
my $name = $ent -> {' name' };
441
- PBuild::Verify::verify_filename(" $packid -$name " );
442
- my $tmpname = " $repodir /.$$ .$packid -$name " ;
445
+ my $binname = " $packid -$name " ;
446
+ PBuild::Verify::verify_filename($binname );
447
+ my $tmpname = " .$$ .$binname " ;
443
448
if (!defined ($xfile )) {
444
449
return undef unless $files -> {$name };
445
- return $ tmpname; # ok, extract this one!
450
+ return " $repodir / $ tmpname" ; # ok, extract this one!
446
451
}
447
452
my $bin = $files -> {$name };
448
- die unless $bin ;
449
- if ($bin -> {' md5sum' }) {
450
- Build::Download::checkfiledigest($tmpname , " md5:$bin ->{'md5sum'}" );
451
- } elsif ($bin -> {' hdrmd5' } || $bin -> {' leadsigmd5' }) {
452
- my $leadsigmd5 ;
453
- my $hdrmd5 = Build::Rpm::queryhdrmd5($tmpname , \$leadsigmd5 );
454
- die (" downloaded binary does not match hdrmd5\n " ) if $bin -> {' hdrmd5' } && $bin -> {' hdrmd5' } ne ($hdrmd5 || ' ' );
455
- die (" downloaded binary does not match leadsigmd5\n " ) if $bin -> {' leadsigmd5' } && $bin -> {' leadsigmd5' } ne ($leadsigmd5 || ' ' );
456
- }
457
- rename ($tmpname , " $repodir /_gbins/$packid -$name " ) || die (" rename $tmpname $repodir /_gbins/$packid -$name : $! \n " );
458
- die unless ($bin -> {' package' } || ' ' ) eq $packid ;
459
- $bin -> {' filename' } = " $packid -$name " ;
460
- return undef ; # continue extracting
453
+ die unless $bin && ($bin -> {' package' } || ' ' ) eq $packid ;
454
+ $callback -> ($repodir , $tmpname , $binname , $bin );
455
+ return undef ; # continue extracting
461
456
}
462
457
463
458
sub fetch_productbinaries {
464
- my ($url , $repodir , $bins ) = @_ ;
459
+ my ($url , $repodir , $bins , $callback ) = @_ ;
465
460
# group by package
466
461
my %packages ;
467
462
my $location ;
468
463
for my $bin (@$bins ) {
469
464
my $l = $bin -> {' location' };
470
465
die (" fetch_productbinaries: missing location\n " ) unless $l ;
471
466
die (" fetch_productbinaries: bad location $l \n " ) unless $l =~ / ^(.+)\/ ([^\/ ]+)\/ ([^\/ ]+)$ / ;
472
- die (" fetch_productbinaries: package mismatch$l \n " ) unless $2 eq $bin -> {' package' };
473
467
$location = $1 unless defined $location ;
474
468
die (" fetch_productbinaries: location conflict\n " ) unless $1 eq $location ;
475
- $packages {$2 } -> {$3 } = $bin ;
469
+ $packages {$bin -> { ' package ' }} -> {$bin -> { ' fn ' } } = $bin ;
476
470
}
477
- PBuild::Util::mkdir_p(" $repodir /_gbins" );
478
471
my $ua = create_ua();
479
472
for my $packid (sort keys %packages ) {
480
473
my $files = $packages {$packid };
@@ -484,9 +477,10 @@ sub fetch_productbinaries {
484
477
$requrl .= " &binary=" .PBuild::Util::urlencode($_ , 1) for sort keys %$files ;
485
478
my $tmpcpio = " $repodir /.$$ .binaries.cpio" ;
486
479
Build::Download::download($requrl , $tmpcpio , undef , ' ua' => $ua , ' retry' => 3);
487
- PBuild::Cpio::cpio_extract($tmpcpio , sub {fetch_productbinaries_cpioextract($_ [0], $_ [1], $repodir , $packid , $files )});
480
+ PBuild::Cpio::cpio_extract($tmpcpio , sub {fetch_productbinaries_cpioextract($_ [0], $_ [1], $repodir , $packid , $files , $callback )});
488
481
unlink ($tmpcpio );
489
482
}
483
+ return $ua ;
490
484
}
491
485
492
486
1;
0 commit comments