tag 6820 patch usertag 6820 fixed-in-my-arch-branch thanks I did go through the unpacking code and looked for conditions that can cause dpkg-source to abort the unpacking. Then I've tried to add checks for all of these conditions to dpkg-source -b (where at all possible).
I think the attached patch is appropriate to fix this bug. ([EMAIL PROTECTED]/dpkg--devel--1.13--patch-25) Gruesse, -- Frank Lichtenheld <[EMAIL PROTECTED]> www: http://www.djpig.de/
* looking for [EMAIL PROTECTED]/dpkg--devel--1.13--patch-24 to compare with * comparing to [EMAIL PROTECTED]/dpkg--devel--1.13--patch-24 A {arch}/dpkg/dpkg--devel/dpkg--devel--1.13/[EMAIL PROTECTED]/patch-log/patch-25 M scripts/dpkg-source.pl M debian/changelog M ChangeLog M scripts/controllib.pl * modified files --- orig/ChangeLog +++ mod/ChangeLog @@ -1,3 +1,25 @@ +2005-10-07 Frank Lichtenheld <[EMAIL PROTECTED]> + + * scripts/controllib.pl: + (checkversion) add generic check for valid version numbers + (checkpackagename) add generic check for valid package + names + (readmd5sum) add generic function to extract md5sum from + md5sum program output + (setsourcepackage) call checkpackagename on new value + * scripts/dpkg-source.pl: Use the new checks added to + controllib to ensure validity of version and packagename + on build, too. Previously this was only done on + unpack. + + * scripts/dpkg-source.pl: Test on build if directories + added by diff already exist with other type in the original + source since we already tested that on unpack. + + * scripts/dpkg-source.pl (addfile): Test if files are added + twice. Should not happen but as we error out on unpack + better make sure it doesn't. + 2005-10-04 Frank Lichtenheld <[EMAIL PROTECTED]> * scripts/dpkg-source.pl: Check build relation --- orig/debian/changelog +++ mod/debian/changelog @@ -22,6 +22,9 @@ - Let dpkg-source -b check the build relation fields before putting them into the .dsc. As a side effect they also get normalized. Closes: #254449 + - Let dpkg-source ensure (as good as possible) that all + build source packages can also be unpacked. + Closes: #6820, #7014 -- --- orig/scripts/controllib.pl +++ mod/scripts/controllib.pl @@ -243,8 +243,22 @@ $substvar{'Source-Version'}= $fi{"L Version"}; } +sub checkpackagename { + my $name = shift || ''; + $name =~ m/[^-+.0-9a-z]/o && + &error("source package name `$name' contains illegal character `$&'"); + $name =~ m/^[0-9a-z]/o || + &error("source package name `$name' starts with non-alphanum"); +} + +sub checkversion { + my $version = shift || ''; + $version =~ m/[^-+:.0-9a-zA-Z~]/o && + &error("version number contains illegal character `$&'"); +} sub setsourcepackage { + checkpackagename( $v ); if (length($sourcepackage)) { $v eq $sourcepackage || &error("source package has two conflicting values - $sourcepackage and $v"); @@ -253,6 +267,13 @@ } } +sub readmd5sum { + (my $md5sum = shift) or return; + $md5sum =~ s/^([0-9a-f]{32})\s*\*?-?\s*\n?$/$1/o + || &failure("md5sum gave bogus output `$md5sum'"); + return $md5sum; +} + sub parsecdata { local ($source,$many,$whatmsg) = @_; # many=0: ordinary control data like output from dpkg-parsechangelog --- orig/scripts/dpkg-source.pl +++ mod/scripts/dpkg-source.pl @@ -218,6 +218,7 @@ if (m/^Source$/) { &setsourcepackage; } elsif (m/^Version$/) { + checkversion( $v ); $f{$_}= $v; } elsif (s/^X[BS]*C[BS]*-//i) { $f{$_}= $v; @@ -466,6 +467,12 @@ &unrepdiff("device or socket is not allowed"); } elsif (-d _) { $type{$fn}= 'directory'; + if (!lstat("$origdir/$fn")) { + $! == ENOENT + || &syserr("cannot stat orig file $origdir/$fn"); + } elsif (! -d _) { + &unrepdiff2('not a directory', 'directory'); + } } else { &unrepdiff("unknown file type ($!)"); } @@ -581,14 +588,10 @@ } $sourcepackage = $fi{'S Source'}; - $sourcepackage =~ m/[^-+.0-9a-z]/ && - &error("source package name contains illegal character `$&'"); - $sourcepackage =~ m/^[0-9a-z]/ || - &error("source package name starts with non-alphanum"); + checkpackagename( $sourcepackage ); $version= $fi{'S Version'}; - $version =~ m/[^-+:.0-9a-zA-Z~]/ && - &error("version number contains illegal character `$&'"); + checkversion( $version ); $version =~ s/^\d+://; if ($version =~ m/-([^-]+)$/) { $baseversion= $`; $revision= $1; @@ -837,9 +840,7 @@ (@s= stat(STDIN)) || &syserr("cannot fstat $dscdir/$f"); $s[7] == $size{$f} || &error("file $f has size $s[7] instead of expected $size{$f}"); $m= `md5sum`; $? && subprocerr("md5sum $f"); $m =~ s/\n$//; - $m =~ s/ *\*?-$//; # Remove trailing spaces and -, to work with GNU md5sum - # also ignore the additional * added by md5sum -b - $m =~ m/^[0-9a-f]{32}$/ || &failure("md5sum of $f gave bad output `$m'"); + $m = readmd5sum( $m ); $m eq $md5sum{$f} || &error("file $f has md5sum $m instead of expected $md5sum{$f}"); open(STDIN,"</dev/null") || &syserr("reopen stdin from /dev/null"); } @@ -1244,14 +1245,16 @@ close(GZIPFILE); } +my %added_files; sub addfile { my ($filename)= @_; + $added_files{$filename}++ && + &internerr( "tried to add file `$filename' twice" ); stat($filename) || &syserr("could not stat output file `$filename'"); $size= (stat _)[7]; my $md5sum= `md5sum <$filename`; $? && &subprocerr("md5sum $filename"); - $md5sum =~ s/^([0-9a-f]{32})\s*\*?-?\s*\n$/$1/ - || &failure("md5sum gave bogus output `$md5sum'"); + $md5sum = readmd5sum( $md5sum ); $f{'Files'}.= "\n $md5sum $size $filename"; } * added files --- /dev/null +++ /home/djpig/debian/patch25/,,[EMAIL PROTECTED]/new-files-archive/./{arch}/dpkg/dpkg--devel/dpkg--devel--1.13/[EMAIL PROTECTED]/patch-log/patch-25 @@ -0,0 +1,28 @@ +Revision: dpkg--devel--1.13--patch-25 +Archive: [EMAIL PROTECTED] +Creator: Frank Lichtenheld <[EMAIL PROTECTED]> +Date: Fri Oct 7 23:42:23 CEST 2005 +Standard-date: 2005-10-07 21:42:23 GMT +Modified-files: ChangeLog debian/changelog + scripts/controllib.pl scripts/dpkg-source.pl +New-patches: [EMAIL PROTECTED]/dpkg--devel--1.13--patch-25 +Summary: ensure all build source packages can also be unpacked +Keywords: 6820 7014 controllib dpkg-source + +* scripts/controllib.pl: +(checkversion) add generic check for valid version numbers +(checkpackagename) add generic check for valid package +names +(readmd5sum) add generic function to extract md5sum from +md5sum program output +(setsourcepackage) call checkpackagename on new value +* scripts/dpkg-source.pl: Use the new checks added to +controllib to ensure validity of version and packagename +on build, too. Previously this was only done on +unpack. +* scripts/dpkg-source.pl: Test on build if directories +added by diff already exist with other type in the original +source since we already tested that on unpack. +* scripts/dpkg-source.pl (addfile): Test if files are added +twice. Should not happen but as we error out on unpack +better make sure it doesn't.