mailing list of musl libc
 help / color / mirror / code / Atom feed
* [PATCH] fix ldso reserved library name handling
@ 2016-11-01  1:49 Szabolcs Nagy
  2016-11-07 17:03 ` Rich Felker
  0 siblings, 1 reply; 2+ messages in thread
From: Szabolcs Nagy @ 2016-11-01  1:49 UTC (permalink / raw)
  To: musl

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.
---

this is not the smallest possible patch (most of the diff is
indentation change), but i found the code cleaner without
the z and l-3 computation.

 ldso/dynlink.c | 38 +++++++++++++++++++-------------------
 1 file changed, 19 insertions(+), 19 deletions(-)

diff --git a/ldso/dynlink.c b/ldso/dynlink.c
index d11776d..acb73bc 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.10.1



^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] fix ldso reserved library name handling
  2016-11-01  1:49 [PATCH] fix ldso reserved library name handling Szabolcs Nagy
@ 2016-11-07 17:03 ` Rich Felker
  0 siblings, 0 replies; 2+ messages in thread
From: Rich Felker @ 2016-11-07 17:03 UTC (permalink / raw)
  To: musl

On Tue, Nov 01, 2016 at 02:49:09AM +0100, Szabolcs Nagy wrote:
> 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.
> ---
> 
> this is not the smallest possible patch (most of the diff is
> indentation change), but i found the code cleaner without
> the z and l-3 computation.
> 
>  ldso/dynlink.c | 38 +++++++++++++++++++-------------------
>  1 file changed, 19 insertions(+), 19 deletions(-)

The existing code was obviously wrong and this seems to work with
simple testing (dlopen of reserved names still yields self pointer,
dlopen of nonexistent prefixes fails) so I'm committing it. Thanks.

Rich


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2016-11-07 17:03 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-11-01  1:49 [PATCH] fix ldso reserved library name handling Szabolcs Nagy
2016-11-07 17:03 ` Rich Felker

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/musl/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).