diff options
Diffstat (limited to 'main/musl/0030-fix-ldso-reserved-library-name-handling.patch')
-rw-r--r-- | main/musl/0030-fix-ldso-reserved-library-name-handling.patch | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/main/musl/0030-fix-ldso-reserved-library-name-handling.patch b/main/musl/0030-fix-ldso-reserved-library-name-handling.patch new file mode 100644 index 0000000000..fc410c6a46 --- /dev/null +++ b/main/musl/0030-fix-ldso-reserved-library-name-handling.patch @@ -0,0 +1,69 @@ +From 5ffe515ca485c8e6e57cd5acda6bc6008f85660c Mon Sep 17 00:00:00 2001 +From: Szabolcs Nagy <nsz@port70.net> +Date: Tue, 1 Nov 2016 02:49:09 +0100 +Subject: [PATCH] fix ldso reserved library name handling + +If a DT_NEEDED entry was the prefix of a reserved library name +(up to the first dot) then it was incorrectly treated as a libc +reserved name. + +e.g. libp.so dependency was not loaded as it matched libpthread +reserved name. +--- + ldso/dynlink.c | 38 +++++++++++++++++++------------------- + 1 file changed, 19 insertions(+), 19 deletions(-) + +diff --git a/ldso/dynlink.c b/ldso/dynlink.c +index d11776dc..acb73bc2 100644 +--- a/ldso/dynlink.c ++++ b/ldso/dynlink.c +@@ -906,27 +906,27 @@ static struct dso *load_library(const char *name, struct dso *needed_by) + /* Catch and block attempts to reload the implementation itself */ + if (name[0]=='l' && name[1]=='i' && name[2]=='b') { + static const char reserved[] = +- "c\0pthread\0rt\0m\0dl\0util\0xnet\0"; +- const char *rp; +- char *z = strchr(name, '.'); +- if (z) { +- size_t l = z-name; +- for (rp=reserved; *rp && strncmp(name+3, rp, l-3); rp+=strlen(rp)+1); +- if (*rp) { +- if (ldd_mode) { +- /* Track which names have been resolved +- * and only report each one once. */ +- static unsigned reported; +- unsigned mask = 1U<<(rp-reserved); +- if (!(reported & mask)) { +- reported |= mask; +- dprintf(1, "\t%s => %s (%p)\n", +- name, ldso.name, +- ldso.base); +- } ++ "c.pthread.rt.m.dl.util.xnet."; ++ const char *rp, *next; ++ for (rp=reserved; *rp; rp=next) { ++ next = strchr(rp, '.') + 1; ++ if (strncmp(name+3, rp, next-rp) == 0) ++ break; ++ } ++ if (*rp) { ++ if (ldd_mode) { ++ /* Track which names have been resolved ++ * and only report each one once. */ ++ static unsigned reported; ++ unsigned mask = 1U<<(rp-reserved); ++ if (!(reported & mask)) { ++ reported |= mask; ++ dprintf(1, "\t%s => %s (%p)\n", ++ name, ldso.name, ++ ldso.base); + } +- is_self = 1; + } ++ is_self = 1; + } + } + if (!strcmp(name, ldso.name)) is_self = 1; +-- +2.11.0 + |