X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fldso%2Fdynlink.c;h=6ff8850c8eb89d55ac4c16799bc12e5e09ca0d45;hb=61c2cf877ba7518a46d0391f119b3251e5a136b2;hp=01c7f29409bda59492db8d8d6cc53ab43a88cef1;hpb=ce4d97e3dc0aaec915f500bc1ef955208a5ef4c2;p=musl diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c index 01c7f294..6ff8850c 100644 --- a/src/ldso/dynlink.c +++ b/src/ldso/dynlink.c @@ -47,9 +47,9 @@ struct dso size_t map_len; dev_t dev; ino_t ino; - int global; - int relocated; - int constructed; + char global; + char relocated; + char constructed; struct dso **deps; char *name; char buf[]; @@ -610,9 +610,11 @@ void *dlopen(const char *file, int mode) { struct dso *volatile p, *orig_tail = tail, *next; size_t i; + int cs; if (!file) return head; + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); pthread_rwlock_wrlock(&lock); if (setjmp(rtld_fail)) { @@ -628,8 +630,8 @@ void *dlopen(const char *file, int mode) } tail = orig_tail; tail->next = 0; - pthread_rwlock_unlock(&lock); - return 0; + p = 0; + goto end; } p = load_library(file); @@ -658,6 +660,7 @@ void *dlopen(const char *file, int mode) do_init_fini(tail); end: pthread_rwlock_unlock(&lock); + pthread_setcancelstate(cs, 0); return p; }