aboutsummaryrefslogtreecommitdiffstats
path: root/main/musl/0030-fix-ldso-reserved-library-name-handling.patch
diff options
context:
space:
mode:
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.patch69
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
+