projects
/
musl
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
move the dynamic linker's jmp_buf from static to automatic storage
[musl]
/
src
/
ldso
/
dynlink.c
diff --git
a/src/ldso/dynlink.c
b/src/ldso/dynlink.c
index
b5e4b72
..
98a18bb
100644
(file)
--- 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 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);
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);
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;
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);
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));
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;
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;
size_t orig_tls_cnt, orig_tls_offset, orig_tls_align;
size_t i;
int cs;
+ jmp_buf jb;
if (!file) return head;
if (!file) return head;
@@
-1071,7
+1072,8
@@
void *dlopen(const char *file, int mode)
orig_tail = tail;
noload = mode & RTLD_NOLOAD;
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)
/* 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)