Bug in cleanup_invalid_links

Sam Lunt <[email protected]> Tue, 1 Sep 2020 23:01:50 -0500
Newsgroups gmane.comp.gnu.stow.bugs
Message-ID <CAGn10uXev=i-WcWcMbNzxAMfqBS6=J72h0S=grsSrEXWbv8PmQ@mail.gmail.com>
Hello,

I found a bug in the cleanup_invalid_links subroutine that leads to a
spurious warning being printed when the directory has a broken symlink
containing an absolute path. The issue is with these lines (1032-1033
on my system):
    not -e join_paths($dir, $source) and # bad link
    $self->path_owned_by_package($node_path, $source) # owned by stow

The bug can be recreated using the following steps (/x/y/z can be
replaced with any non-existent absolute path):
    $ mkdir /tmp/stow_bug
    $ mkdir /tmp/stow_bug/packages
    $ mkdir /tmp/stow_bug/packages/p1
    $ ln -s /x/y/z /tmp/stow_bug/xyz
    $ cd /tmp/stow_bug/packages
    $ stow -D p1

This will print the error message:
    BUG in find_stowed_path? Absolute/relative mismatch between Stow
dir packages and path /x/y/z at /usr/share/perl5/vendor_perl/Stow.pm
line 966, line 22.

I think that when $source is an absolute path, the entire check can be
skipped, since a symlink containing an absolute path could never be a
stale Stow link.

I think it's probably sufficient to change the lines 1032-33 from above to be:
    substr($source, 0, 1) ne '/' and # path is relative
    not -e join_paths($dir, $source) and # bad link
    $self->path_owned_by_package($node_path, $source) # owned by stow

Best,
Sam