提交 642b7593 编写于 作者: R Rich Felker

fix race condition in dlopen

orig_tail was being saved before the lock was obtained, allowing
dlopen failure to roll-back other dlopens that had succeeded.
上级 99a2af6f
......@@ -886,7 +886,7 @@ void *__dynlink(int argc, char **argv)
void *dlopen(const char *file, int mode)
{
struct dso *volatile p, *orig_tail = tail, *next;
struct dso *volatile p, *orig_tail, *next;
size_t i;
int cs;
......@@ -895,6 +895,8 @@ void *dlopen(const char *file, int mode)
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
pthread_rwlock_wrlock(&lock);
orig_tail = tail;
if (setjmp(rtld_fail)) {
/* Clean up anything new that was (partially) loaded */
if (p->deps) for (i=0; p->deps[i]; i++)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册