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;