On Mon, Feb 23, 2026 at 03:17:36PM +0100, Vincent Lefevre wrote:
> This is an old bug in the "info" utility, which no longer appeared in
> 7.1.1 and 7.2, but reappeared in 7.2.92 (all my tests have been done
> under Debian, with Debian packages):
>
> https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=484740
I've confirmed the bug (assuming it is one) isn't present in 7.2.
It's likely the bug was fixed inadvertently through other changes
to the code, and again broken again by mistake.
It's related to the 'follow-strategy' variable. If this is "remain",
which is the default, Info files in the same directory are preferred.
As you found, this can interact badly with the historic support for
Info files without any file extension at all. It is not a case that
has been reported, as far as I remember, as it depends on a particular
layout of source code files, but when it does happen it could be quite
confusing. If you want the manual foo.info for program foo and there
is a file called foo (probably the executable) in the current directory,
but foo.info is elsewhere, then foo.info is blocked from loading.
I tested this with a directory that contained just info-stnd.info
and an empty file called "texinfo", with the link from info-stnd.info
to the "texinfo" manual. (I don't have info.info on my system as
this file is distributed with Emacs and I am not an Emacs user.)
In Texinfo 7.2, the call is made to info_find_file with the argument
"./texinfo", which then calls info_load_file, which fails and returns
a null argument. The calling code in info_get_node_with_defaults
then searches for the file with the search path as usual, which leads
the file to be found in the Info installation directory.
In the development code (and 7.2.92) the code has been moved around
somewhat and info_find_file and info_load_file aren't called.
If you can check the following works in your testing, we can commit
it and include it in the next release (hopefully in the next few
days).
diff --git a/info/session-cmd.c b/info/session-cmd.c
index 20821d194c..d090b7a156 100644
--- a/info/session-cmd.c
+++ b/info/session-cmd.c
@@ -1144,7 +1144,13 @@ filename_for_xref (char *filename_in, NODE *defaults)
defaults->fullpath, 0);
*p = saved_char;
if (file_in_same_dir)
- filename = file_in_same_dir;
+ {
+ /* Ensure file can be loaded and at least looks
+ like an Info file. */
+ FILE_BUFFER *fb2 = info_find_file (file_in_same_dir);
+ if (fb2)
+ filename = file_in_same_dir;
+ }
}
}
}
> In short, where resolving a cross reference, "info" tries various
> variants of the file name in the same directory as the referencing
> info file, then do the same thing in the directories of the info
> path. But if there is a non-info file in the way, e.g. a "libtool"
> script when searching for the libtool info manual, the buggy info
> versions stop there instead of detecting that this file does not
> have the info format and resuming the search.
>
> To reproduce with the GNU MPFR source tree:
>
> 1. I copied the libtool script to the doc directory in the MPFR
> source tree, i.e. where mpfr.info can be found (to mimic the
> old file hierarchy).
>
> 2. In this doc directory: strace -o str.out -f info ./mpfr
>
> 3. /libtool to search for "libtool" in the MPFR manual.
>
> 4. Type [Enter] over "*note GNU Libtool: (libtool)Top".
>
> With info 7.2, the "libtool" script is read, but info resumes
> the search and eventually finds the libtool manual in some other
> directory. But with info 7.2.92, the search stops there:
Maybe we should cut the support for the ".Y" extension (for "yabba"
compressed files) after the next release. It would cut down strace
output like that you quoted. There's very little information online
about this format. It appears to have been a format/program by
Daniel Bernstein from around 1991, that never caught on. It appears
to have been posted to the comp.sources.unix newsgroup as part of
a package called "yabbawhap" (*). Possibly people in the GNU project
were considering it as a replacement for the then-patent-encumbered Unix
compress program. (gzip does not appear to have been released until
1992.)
(*) https://www.tuhs.org/Usenet/comp.sources.unix/1991-March/006338.html
>
> [...]
> 29616 newfstatat(AT_FDCWD, "./libtool.info", 0x7ffc1d310260, 0) = -1 ENOENT
> (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool.info.gz", 0x7ffc1d310260, 0) = -1
> ENOENT (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool.info.lz", 0x7ffc1d310260, 0) = -1
> ENOENT (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool.info.xz", 0x7ffc1d310260, 0) = -1
> ENOENT (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool.info.bz2", 0x7ffc1d310260, 0) = -1
> ENOENT (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool.info.z", 0x7ffc1d310260, 0) = -1 ENOENT
> (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool.info.lzma", 0x7ffc1d310260, 0) = -1
> ENOENT (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool.info.Z", 0x7ffc1d310260, 0) = -1 ENOENT
> (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool.info.zst", 0x7ffc1d310260, 0) = -1
> ENOENT (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool.info.Y", 0x7ffc1d310260, 0) = -1 ENOENT
> (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool-info", 0x7ffc1d310260, 0) = -1 ENOENT
> (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool-info.gz", 0x7ffc1d310260, 0) = -1
> ENOENT (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool-info.lz", 0x7ffc1d310260, 0) = -1
> ENOENT (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool-info.xz", 0x7ffc1d310260, 0) = -1
> ENOENT (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool-info.bz2", 0x7ffc1d310260, 0) = -1
> ENOENT (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool-info.z", 0x7ffc1d310260, 0) = -1 ENOENT
> (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool-info.lzma", 0x7ffc1d310260, 0) = -1
> ENOENT (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool-info.Z", 0x7ffc1d310260, 0) = -1 ENOENT
> (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool-info.zst", 0x7ffc1d310260, 0) = -1
> ENOENT (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool-info.Y", 0x7ffc1d310260, 0) = -1 ENOENT
> (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool.inf", 0x7ffc1d310260, 0) = -1 ENOENT
> (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool.inf.gz", 0x7ffc1d310260, 0) = -1 ENOENT
> (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool.inf.lz", 0x7ffc1d310260, 0) = -1 ENOENT
> (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool.inf.xz", 0x7ffc1d310260, 0) = -1 ENOENT
> (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool.inf.bz2", 0x7ffc1d310260, 0) = -1
> ENOENT (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool.inf.z", 0x7ffc1d310260, 0) = -1 ENOENT
> (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool.inf.lzma", 0x7ffc1d310260, 0) = -1
> ENOENT (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool.inf.Z", 0x7ffc1d310260, 0) = -1 ENOENT
> (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool.inf.zst", 0x7ffc1d310260, 0) = -1
> ENOENT (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool.inf.Y", 0x7ffc1d310260, 0) = -1 ENOENT
> (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "./libtool", {st_mode=S_IFREG|0755,
> st_size=352925, ...}, 0) = 0
> 29616 newfstatat(AT_FDCWD, "./libtool", {st_mode=S_IFREG|0755,
> st_size=352925, ...}, 0) = 0
> 29616 openat(AT_FDCWD, "./libtool", O_RDONLY) = 3
> 29616 mmap(NULL, 356352, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
> 0) = 0x7f98778bc000
> 29616 read(3, "#! /bin/sh\n# Generated automatic"..., 352925) = 352925
> 29616 close(3) = 0
> 29616 munmap(0x7f98778bc000, 356352) = 0
> 29616 newfstatat(AT_FDCWD,
> "/home/vlefevre/.config/texinfo/info-hooks/manual-not-found", 0x7ffc1d310250,
> 0) = -1 ENOENT (No such file or directory)
> 29616 newfstatat(AT_FDCWD, "/etc/xdg/texinfo/info-hooks/manual-not-found",
> 0x7ffc1d310250, 0) = -1 ENOENT (No such file or directory)
> 29616 rt_sigprocmask(SIG_BLOCK, [WINCH], [], 8) = 0
> 29616 write(1, "\7\33[60;1HCannot find node 'Top'", 30) = 30
> [...]
>
> --
> Vincent Lefèvre <[email protected]> - Web: <https://www.vinc17.net/>
> 100% accessible validated (X)HTML - Blog: <https://www.vinc17.net/blog/>
> Work: CR INRIA - computer arithmetic / Pascaline project (LIP, ENS-Lyon)
>