[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: update-alternatives broken?



On Sat, Sep 01, 2001 at 09:51:58AM +0200, Richard Higson wrote:

> On Thu, Aug 30, 2001 at 06:44:00PM -0400, Matt Zimmerman wrote:
> > On my s390 system in Hercules, update-alternatives fails for every package
> > which uses it:
> > [...]
> > All of the invocations appear to be correct (a similar error in all of these
> > packages would be quite unlikely), and update-alternatives isn't doing
> > anything ridiculous that I can see, so maybe this is a Perl bug of some
> > sort?
> I tried adding 'use integer;' in `update-alternatives` but the problem
> hasn't gone away.  I thought it might have something to do with the way
> Hercules does floating point, (which is default in perl).

I think you may be correct in thinking that it may be a floating point
problem.  I added some debugging statements to update-alternatives (diff
attached), and it looks like for $var = 1, $var-- is setting $var to 0.5
(!):

sname: nawk
oldslavelink: /usr/bin/nawk
newslavelink: /usr/bin/nawk
slavelinkcount{oldslavelink} = 1
slavelinkcount{newslavelink} = 1
slave link name /usr/bin/nawk duplicated at ./update-alternatives line 297.
slavelinkcount{oldslavelink} = 1.5
slavelinkcount{newslavelink} = 1.5
sname: awk.1.gz
oldslavelink: /usr/share/man/man1/awk.1.gz
newslavelink: /usr/share/man/man1/awk.1.gz
slavelinkcount{oldslavelink} = 1
slavelinkcount{newslavelink} = 1
slave link name /usr/share/man/man1/awk.1.gz duplicated at
./update-alternatives line 297.
slavelinkcount{oldslavelink} = 1.5
slavelinkcount{newslavelink} = 1.5
sname: nawk.1.gz
oldslavelink: /usr/share/man/man1/nawk.1.gz
newslavelink: /usr/share/man/man1/nawk.1.gz
slavelinkcount{oldslavelink} = 1
slavelinkcount{newslavelink} = 1
slave link name /usr/share/man/man1/nawk.1.gz duplicated at
./update-alternatives line 297.

Here is correct output from an i386 system:

sname: nawk
oldslavelink: /usr/bin/nawk
newslavelink: /usr/bin/nawk
slavelinkcount{oldslavelink} = 1
slavelinkcount{newslavelink} = 1
slavelinkcount{oldslavelink} = 1
slavelinkcount{newslavelink} = 1
sname: awk.1.gz
oldslavelink: /usr/share/man/man1/awk.1.gz
newslavelink: /usr/share/man/man1/awk.1.gz
slavelinkcount{oldslavelink} = 1
slavelinkcount{newslavelink} = 1
slavelinkcount{oldslavelink} = 1
slavelinkcount{newslavelink} = 1
sname: nawk.1.gz
oldslavelink: /usr/share/man/man1/nawk.1.gz
newslavelink: /usr/share/man/man1/nawk.1.gz
slavelinkcount{oldslavelink} = 1
slavelinkcount{newslavelink} = 1
slavelinkcount{oldslavelink} = 1
slavelinkcount{newslavelink} = 1

I tried to reproduce the problem with a smaller Perl program, like this:

$a = $b = "foo";
$h{$a} = $h{$b} = 1;
$h{$a}-- if $a ne '';
warn "bad\n" if $h{$b}++;
print "$h{$a}, $h{$b}\n";

...which duplicates what is going on in that particular section of code, but
it produced the correct output:

1, 1                                                                            

So either the bug is much more subtle than I had hoped, or I've missed
something.

-- 
 - mdz
--- /usr/sbin/update-alternatives	Tue Aug 21 19:51:02 2001
+++ update-alternatives	Wed Sep 12 14:24:50 2001
@@ -282,15 +282,23 @@
     }
     $priorities[$i]= $apriority;
     for $sname (keys %aslavelink) {
+        warn "sname: $sname\n";
         if (!defined($j= $slavenum{$sname})) {
             push(@slavenames,$sname);
             $slavenum{$sname}= $j= $#slavenames;
         }
         $oldslavelink= $slavelinks[$j];
+	warn "oldslavelink: $oldslavelink\n";
         $newslavelink= $aslavelink{$sname};
+	warn "newslavelink: $newslavelink\n";
+	warn "slavelinkcount{oldslavelink} = $slavelinkcount{$oldslavelink}\n";
+	warn "slavelinkcount{newslavelink} = $slavelinkcount{$newslavelink}\n";
         $slavelinkcount{$oldslavelink}-- if $oldslavelink ne '';
+	warn "slavelinkcount{oldslavelink} = $slavelinkcount{$oldslavelink}\n";
         $slavelinkcount{$newslavelink}++ &&
-            &quit("slave link name $newslavelink duplicated");
+            warn("slave link name $newslavelink duplicated");
+	warn "slavelinkcount{oldslavelink} = $slavelinkcount{$oldslavelink}\n";
+	warn "slavelinkcount{newslavelink} = $slavelinkcount{$newslavelink}\n";
         if ($newslavelink ne $oldslavelink && $oldslavelink ne '') {
             &pr("Renaming $sname slave link from $oldslavelink to $newslavelink.")
               if $verbosemode > 0;

Reply to: