diff options
Diffstat (limited to 'src/ldso/dynlink.c')
-rw-r--r-- | src/ldso/dynlink.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c index b5e4b72f..98a18bba 100644 --- a/src/ldso/dynlink.c +++ b/src/ldso/dynlink.c @@ -101,7 +101,7 @@ static int runtime; static int ldd_mode; static int ldso_fail; static int noload; -static jmp_buf rtld_fail; +static jmp_buf *rtld_fail; static pthread_rwlock_t lock; static struct debug debug; static size_t tls_cnt, tls_offset, tls_align = 4*sizeof(size_t); @@ -255,7 +255,7 @@ static void do_relocs(struct dso *dso, size_t *rel, size_t rel_size, size_t stri snprintf(errbuf, sizeof errbuf, "Error relocating %s: %s: symbol not found", dso->name, name); - if (runtime) longjmp(rtld_fail, 1); + if (runtime) longjmp(*rtld_fail, 1); dprintf(2, "%s\n", errbuf); ldso_fail = 1; continue; @@ -613,14 +613,14 @@ static void load_deps(struct dso *p) snprintf(errbuf, sizeof errbuf, "Error loading shared library %s: %m (needed by %s)", p->strings + p->dynv[i+1], p->name); - if (runtime) longjmp(rtld_fail, 1); + if (runtime) longjmp(*rtld_fail, 1); dprintf(2, "%s\n", errbuf); ldso_fail = 1; continue; } if (runtime) { tmp = realloc(*deps, sizeof(*tmp)*(ndeps+2)); - if (!tmp) longjmp(rtld_fail, 1); + if (!tmp) longjmp(*rtld_fail, 1); tmp[ndeps++] = dep; tmp[ndeps] = 0; *deps = tmp; @@ -1057,6 +1057,7 @@ void *dlopen(const char *file, int mode) size_t orig_tls_cnt, orig_tls_offset, orig_tls_align; size_t i; int cs; + jmp_buf jb; if (!file) return head; @@ -1071,7 +1072,8 @@ void *dlopen(const char *file, int mode) orig_tail = tail; noload = mode & RTLD_NOLOAD; - if (setjmp(rtld_fail)) { + rtld_fail = &jb; + if (setjmp(*rtld_fail)) { /* Clean up anything new that was (partially) loaded */ if (p && p->deps) for (i=0; p->deps[i]; i++) if (p->deps[i]->global < 0) |