elf: Handle non-directory name in search path (BZ 31035)
commita8dcffb30680d6db5704f9ce2fc30621ceb454e7
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Fri, 10 Nov 2023 13:43:12 +0000 (10 10:43 -0300)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Thu, 16 Nov 2023 14:01:51 +0000 (16 11:01 -0300)
treebcac86f64fb7b6a3805a84f6481df67007d7f697
parent3fddfe3c5d3c61f91401393814f7dc33be9c7dd3
elf: Handle non-directory name in search path (BZ 31035)

The open_path stops if a relative path in search path contains a
component that is a non directory (for instance, if the component
is an existing file).

For instance:

  $ cat > lib.c <<EOF
  > void foo (void) {}
  > EOF
  $ gcc -shared -fPIC -o lib.so lib.c
  $ cat > main.c <<EOF
  extern void foo ();
  int main () { foo (); return 0; }
  EOF
  $ gcc -o main main.c lib.so
  $ LD_LIBRARY_PATH=. ./main
  $ LD_LIBRARY_PATH=non-existing/path:. ./main
  $ LD_LIBRARY_PATH=$(pwd)/main:. ./main
  $ LD_LIBRARY_PATH=./main:. ./main
  ./main: error while loading shared libraries: lib.so: cannot open shared object file: No such file or directory

The invalid './main' should be ignored as a non-existent one,
instead as a valid but non accessible file.

Absolute paths do not trigger this issue because their status are
initialized as 'unknown' and open_path check if this is a directory.

Checked on x86_64-linux-gnu.

Reviewed-by: Szabolcs Nagy <szabolcs.nagy@arm.com>
elf/Makefile
elf/dl-load.c
elf/tst-non-directory-mod.c [new file with mode: 0644]
elf/tst-non-directory-path.c [new file with mode: 0644]
elf/tst-non-directory-path.sh [new file with mode: 0755]