|
Message-ID: <20240207012247.1121273-2-mmayer@broadcom.com> Date: Tue, 6 Feb 2024 17:22:43 -0800 From: Markus Mayer <mmayer@...adcom.com> To: Musl Mailing List <musl@...ts.openwall.com> Cc: Markus Mayer <mmayer@...adcom.com> Subject: [PATCH 1/1] ldso: continue searching if wrong architecture is found first When LD_LIBRARY_PATH is being used, the shared library loader may end up finding a shared library with the correct name but from a wrong architecture. This primarily happens when a 32-bit / 64-bit mismatch occurs. Rather than giving up immediately and aborting, the shared library loader should continue to look in all known locations for a matching library that may work. Signed-off-by: Markus Mayer <mmayer@...adcom.com> --- ldso/dynlink.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/ldso/dynlink.c b/ldso/dynlink.c index fd09ca69932c..d7f085b0a212 100644 --- a/ldso/dynlink.c +++ b/ldso/dynlink.c @@ -1019,6 +1019,7 @@ static struct dso *load_library(const char *name, struct dso *needed_by) size_t alloc_size; int n_th = 0; int is_self = 0; + int is_using_env_path = 0; if (!*name) { errno = EINVAL; @@ -1072,7 +1073,11 @@ static struct dso *load_library(const char *name, struct dso *needed_by) } if (strlen(name) > NAME_MAX) return 0; fd = -1; - if (env_path) fd = path_open(name, env_path, buf, sizeof buf); + if (env_path) { + fd = path_open(name, env_path, buf, sizeof buf); + is_using_env_path = (fd >= 0); + } +retry: for (p=needed_by; fd == -1 && p; p=p->needed_by) { if (fixup_rpath(p, buf, sizeof buf) < 0) fd = -2; /* Inhibit further search. */ @@ -1138,7 +1143,16 @@ static struct dso *load_library(const char *name, struct dso *needed_by) } map = noload ? 0 : map_library(fd, &temp_dso); close(fd); - if (!map) return 0; + if (!map) { + if (is_using_env_path) { + /* If LD_LIBARY_PATH resulted in a library that couldn't + * be loaded, let's try the default locations. */ + fd = -1; + is_using_env_path = 0; + goto retry; + } + return 0; + } /* Avoid the danger of getting two versions of libc mapped into the * same process when an absolute pathname was used. The symbols -- 2.43.0
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.