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: