mirror of https://gitee.com/Nocallback/glibc.git
Browse Source
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>
azanella/bz23960-dirent
5 changed files with 103 additions and 3 deletions
@ -0,0 +1 @@ |
|||
void foo (void) {} |
|||
@ -0,0 +1,7 @@ |
|||
extern void foo (void); |
|||
|
|||
int main (int argc, char *argv[]) |
|||
{ |
|||
foo (); |
|||
return 0; |
|||
} |
|||
@ -0,0 +1,77 @@ |
|||
#!/bin/sh |
|||
# Test if library search path does not terminates with non-directory |
|||
# components. |
|||
# Copyright (C) 2023 Free Software Foundation, Inc. |
|||
# This file is part of the GNU C Library. |
|||
# |
|||
# The GNU C Library is free software; you can redistribute it and/or |
|||
# modify it under the terms of the GNU Lesser General Public |
|||
# License as published by the Free Software Foundation; either |
|||
# version 2.1 of the License, or (at your option) any later version. |
|||
# |
|||
# The GNU C Library is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
# Lesser General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU Lesser General Public |
|||
# License along with the GNU C Library; if not, see |
|||
# <https://www.gnu.org/licenses/>. |
|||
|
|||
set -e |
|||
|
|||
rtld=$1 |
|||
test_program=$2 |
|||
test_wrapper_env=$3 |
|||
run_program_env=$4 |
|||
# Remove the last space to allow concatenate extra paths. |
|||
library_path=$(echo $5) |
|||
objpfx=$6 |
|||
|
|||
test_binary=$(basename ${test_program}) |
|||
test_libpath=${test_binary}-x |
|||
|
|||
mkdir -p ${objpfx}/${test_libpath} |
|||
mv ${objpfx}/tst-non-directory-mod.so ${objpfx}/${test_libpath} |
|||
|
|||
# Check with absolute paths. |
|||
${test_wrapper_env} \ |
|||
${run_program_env} \ |
|||
$rtld --inhibit-cache \ |
|||
--library-path \ |
|||
"$library_path":"${objpfx}"tst-non-directory-invalid:"${objpfx}"${test_libpath} \ |
|||
$test_program 2>&1 && rc=0 || rc=$? |
|||
|
|||
${test_wrapper_env} \ |
|||
${run_program_env} \ |
|||
$rtld --inhibit-cache \ |
|||
--library-path \ |
|||
"$library_path":"${objpfx}"${test_binary}:"${objpfx}"${test_libpath} \ |
|||
$test_program 2>&1 && rc=0 || rc=$? |
|||
|
|||
# Relative paths along with non-existent path in search list. |
|||
cd "$objpfx" |
|||
${test_wrapper_env} \ |
|||
${run_program_env} \ |
|||
$rtld --inhibit-cache \ |
|||
--library-path \ |
|||
"$library_path":../elf/tst-non-directory-invalid::../elf/${test_libpath} \ |
|||
$test_program 2>&1 && rc=0 || rc=$? |
|||
|
|||
# Relative paths along with component in the path is not a directory in search list. |
|||
${test_wrapper_env} \ |
|||
${run_program_env} \ |
|||
$rtld --inhibit-cache \ |
|||
--library-path \ |
|||
"$library_path":../elf/${test_binary}:../elf/${test_libpath} \ |
|||
$test_program 2>&1 && rc=0 || rc=$? |
|||
|
|||
# Relative paths along with non-existent path and a component in the path that is not a directory. |
|||
${test_wrapper_env} \ |
|||
${run_program_env} \ |
|||
$rtld --inhibit-cache \ |
|||
--library-path \ |
|||
"$library_path":../elf/tst-non-directory-invalid:../elf/${test_binary}:../elf/${test_libpath} \ |
|||
$test_program 2>&1 && rc=0 || rc=$? |
|||
|
|||
exit $rc |
|||
Loading…
Reference in new issue