diff options
| -rw-r--r-- | src/ldso/dynlink.c | 7 | 
1 files changed, 5 insertions, 2 deletions
diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c index eda0046e..6ff8850c 100644 --- a/src/ldso/dynlink.c +++ b/src/ldso/dynlink.c @@ -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;  }  | 
