[Pkg-asv-commits] r44 - in trunk: . debian

Andreas Hoenen ahoenen-guest at alioth.debian.org
Sun May 17 09:22:18 UTC 2009


Author: ahoenen-guest
Date: 2009-05-17 09:22:18 +0000 (Sun, 17 May 2009)
New Revision: 44

Modified:
   trunk/apt-show-versions
   trunk/debian/changelog
Log:
BTS #515328:
Fix "use of uninitialized value" warnings:
Improve call strategy of determine_pkgfile_release(), that is augmentation of
missing values of the %releasenames structure:
Obviously the previous strategy of calling the augmentation function at the
start of print_package() for each %apackages release of the current package is
not sufficient in special situations: some structure records keep missing
afterwards, but get refered, resulting in the observed warnings.
Thus protect each access of the %releasenames structure with functions
get_ret_(codename|name|suite) that augment missing values on the fly.

PLEASE NOTE:
Unfortunately I have not managed to reproduce the error scenario depite of both
extensive trials and deep code analysis.  I just don't understand what happens
exactly to let the previous strategy become insufficient.  Thus I'm not able to
test the fix against the error scenario, but have to rely on the error messages
and their analysis.
Observations regarding the error scenario:
- The error scenario seems to be related to a stale $apackagescachefile, which
  is caused by removing a repository from sources.list followed by 'apt-get
  update', but before the next rebuild of the a-s-v cache files.
- The error scenario gets resolved with the next rebuild of the a-s-v cache
  files (e.g. triggered by the daily cron run), thus the patch can't be tested
  against the error scenario even by the reporters.


Modified: trunk/apt-show-versions
===================================================================
--- trunk/apt-show-versions	2008-09-16 08:24:10 UTC (rev 43)
+++ trunk/apt-show-versions	2009-05-17 09:22:18 UTC (rev 44)
@@ -323,9 +323,7 @@
 sub print_package {
     my ($package) = @_;
 
-    # Guarantee existence of %releasenames records for all releases of package
-    # and sort the releases according to this information.
-    &determine_pkgfile_release($_) foreach (keys(%{$apackages->{$package}}));
+    # Sort all releases of package.
     my @pkg_releases = sort sort_pkg_releases values(%{$apackages->{$package}});
 
     # All print information of package must be buffered, as the decision
@@ -358,8 +356,7 @@
         foreach my $pkg (@pkg_releases) {
             # First handle missing official suites to be listed before current
             # release.
-            my $cur_idx =
-                $official_suites{$releasenames{$pkg->{$RELEASE}}{$SUITE}};
+            my $cur_idx = $official_suites{&get_rel_suite($pkg->{$RELEASE})};
             if (defined $cur_idx) {
                 # Current release is an official one:
                 # List prepending missing suites.
@@ -375,11 +372,11 @@
             (my $archive = $pkg->{$RELEASE}) =~ s/_.*//;
             push @print_info, {$PACKAGE => $pkg->{$PACKAGE},
                                $VERSION => $pkg->{$VERSION},
-                               $NAME => $releasenames{$pkg->{$RELEASE}}{$NAME},
+                               $NAME => &get_rel_name($pkg->{$RELEASE}),
                                $ARCHIVE => $archive};
             $max_package_len = &max(length($pkg->{$PACKAGE}), $max_package_len);
             $max_version_len = &max(length($pkg->{$VERSION}), $max_version_len);
-            $max_name_len = &max(length($releasenames{$pkg->{$RELEASE}}{$NAME}),
+            $max_name_len = &max(length(&get_rel_name($pkg->{$RELEASE})),
                                  $max_name_len);
         }
         # Finally handle missing official suites after last existing release.
@@ -409,7 +406,7 @@
             if ($version) {
                 my @version_info;
                 ($found, @version_info) =
-                    &print_version($releasenames{$_->{$RELEASE}}{$NAME},
+                    &print_version(&get_rel_name($_->{$RELEASE}),
                                    $package, $iversion, $version, $cand);
                 push @print_info, @version_info if ($found);
                 $aversion = $version;
@@ -451,7 +448,7 @@
                         push(@print_info,
                              $package,
                              '/',
-                             $releasenames{$release->{$RELEASE}}{$NAME},
+                             &get_rel_name($release->{$RELEASE}),
                              (defined($opts{'brief'})) ? "\n" :
                              " *manually* upgradeable from $iversion to " .
                              "$aversion\n");
@@ -678,9 +675,8 @@
                 if ($releases[$idx]->{$VERSION} eq
                     $releases[$move_idx]->{$VERSION}) {
                     # Current release is of same version as move candidate.
-                    if ($releasenames{$rel_key}{$SUITE} eq $default_release or
-                        $releasenames{$rel_key}{$CODENAME}
-                        eq $default_release) {
+                    if (&get_rel_suite($rel_key) eq $default_release
+                        or &get_rel_codename($rel_key) eq $default_release) {
                         # Move current release before move candidate in order to
                         # place default release first.
                         my $rel = splice @releases, $idx, 1;
@@ -695,8 +691,8 @@
             }
             unless (defined $move_idx) {
                 # Test whether current release is move candidate.
-                if ($releasenames{$rel_key}{$SUITE} ne $default_release and
-                    $releasenames{$rel_key}{$CODENAME} ne $default_release) {
+                if (&get_rel_suite($rel_key) ne $default_release
+                    and &get_rel_codename($rel_key) ne $default_release) {
                     $move_idx = $idx;
                 }
             }
@@ -715,11 +711,10 @@
 sub sort_pkg_releases {
     my $cmp_versions = $vs->compare($a->{$VERSION}, $b->{$VERSION});
     return $cmp_versions if ($cmp_versions);
-    my $cmp_suites = (&suite_idx($releasenames{$a->{$RELEASE}}{$SUITE}) <=>
-                      &suite_idx($releasenames{$b->{$RELEASE}}{$SUITE}));
+    my $cmp_suites = (&suite_idx(&get_rel_suite($a->{$RELEASE})) <=>
+                      &suite_idx(&get_rel_suite($b->{$RELEASE})));
     return $cmp_suites if ($cmp_suites);
-    return($releasenames{$a->{$RELEASE}}{$NAME} cmp
-           $releasenames{$b->{$RELEASE}}{$NAME});
+    return(&get_rel_name($a->{$RELEASE}) cmp &get_rel_name($b->{$RELEASE}));
 }
 
 ################################################################################
@@ -741,6 +736,26 @@
     die @_;
 }
 
+################################################################################
+# Access function for the fields of the %releasenames structure
+# Missing fields are augmented on the fly (compare BTS report #515328).
+################################################################################
+sub get_rel_codename {
+    my $rel_key = shift;
+    &determine_pkgfile_release($rel_key) unless $releasenames{$rel_key};
+    return $releasenames{$rel_key}{$CODENAME};
+}
+sub get_rel_name {
+    my $rel_key = shift;
+    &determine_pkgfile_release($rel_key) unless $releasenames{$rel_key};
+    return $releasenames{$rel_key}{$NAME};
+}
+sub get_rel_suite {
+    my $rel_key = shift;
+    &determine_pkgfile_release($rel_key) unless $releasenames{$rel_key};
+    return $releasenames{$rel_key}{$SUITE};
+}
+
 # script documentation (POD style)
 
 =head1 NAME

Modified: trunk/debian/changelog
===================================================================
--- trunk/debian/changelog	2008-09-16 08:24:10 UTC (rev 43)
+++ trunk/debian/changelog	2009-05-17 09:22:18 UTC (rev 44)
@@ -1,3 +1,11 @@
+apt-show-versions (0.16) UNRELEASED; urgency=low
+
+  * Harden code regarding releases for which properties like their name are
+    unknown, thus avoiding perl warnings about uninitialized values.  Thanks to
+    John V. Belmonte and Anders Boström for reporting.  (Closes: #515328)
+
+ -- Andreas Hoenen <andreas at hoenen-terstappen.de>  Sun, 17 May 2009 09:36:24 +0200
+
 apt-show-versions (0.15) unstable; urgency=low
 
   [ Christoph Martin ]




More information about the Pkg-asv-commits mailing list