summaryrefslogtreecommitdiffstats
path: root/libexec
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2011-02-09 09:20:27 +0000
committerkib <kib@FreeBSD.org>2011-02-09 09:20:27 +0000
commit2d3fe26edea36d31e4691f4a36956d9b6ef35ab1 (patch)
treead7c786b1d3e7efa9edf045df12bf535d6f1ec94 /libexec
parente001171515d48ece0d4d5caf54fd106bb2349fa1 (diff)
downloadFreeBSD-src-2d3fe26edea36d31e4691f4a36956d9b6ef35ab1.zip
FreeBSD-src-2d3fe26edea36d31e4691f4a36956d9b6ef35ab1.tar.gz
Use sigsetjmp/siglongjmp with disabled signal mask access for
lock upgrade in rtld. There is no need to care about the mask, which causes a lot of unneeded sigprocmask(2) calls during each symbol lookup.
Diffstat (limited to 'libexec')
-rw-r--r--libexec/rtld-elf/rtld.c6
-rw-r--r--libexec/rtld-elf/rtld.h2
-rw-r--r--libexec/rtld-elf/rtld_lock.c2
3 files changed, 5 insertions, 5 deletions
diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c
index 50ab393..948cf49 100644
--- a/libexec/rtld-elf/rtld.c
+++ b/libexec/rtld-elf/rtld.c
@@ -560,7 +560,7 @@ _rtld_bind(Obj_Entry *obj, Elf_Size reloff)
RtldLockState lockstate;
rlock_acquire(rtld_bind_lock, &lockstate);
- if (setjmp(lockstate.env) != 0)
+ if (sigsetjmp(lockstate.env, 0) != 0)
lock_upgrade(rtld_bind_lock, &lockstate);
if (obj->pltrel)
rel = (const Elf_Rel *) ((caddr_t) obj->pltrel + reloff);
@@ -2142,7 +2142,7 @@ dlopen(const char *name, int mode)
ld_tracing = (mode & RTLD_TRACE) == 0 ? NULL : "1";
if (ld_tracing != NULL) {
rlock_acquire(rtld_bind_lock, &lockstate);
- if (setjmp(lockstate.env) != 0)
+ if (sigsetjmp(lockstate.env, 0) != 0)
lock_upgrade(rtld_bind_lock, &lockstate);
environ = (char **)*get_program_var_addr("environ", &lockstate);
lock_release(rtld_bind_lock, &lockstate);
@@ -2264,7 +2264,7 @@ do_dlsym(void *handle, const char *name, void *retaddr, const Ver_Entry *ve,
req.lockstate = &lockstate;
rlock_acquire(rtld_bind_lock, &lockstate);
- if (setjmp(lockstate.env) != 0)
+ if (sigsetjmp(lockstate.env, 0) != 0)
lock_upgrade(rtld_bind_lock, &lockstate);
if (handle == NULL || handle == RTLD_NEXT ||
handle == RTLD_DEFAULT || handle == RTLD_SELF) {
diff --git a/libexec/rtld-elf/rtld.h b/libexec/rtld-elf/rtld.h
index 8941d29..bb365a7 100644
--- a/libexec/rtld-elf/rtld.h
+++ b/libexec/rtld-elf/rtld.h
@@ -276,7 +276,7 @@ typedef struct Struct_DoneList {
struct Struct_RtldLockState {
int lockstate;
- jmp_buf env;
+ sigjmp_buf env;
};
/*
diff --git a/libexec/rtld-elf/rtld_lock.c b/libexec/rtld-elf/rtld_lock.c
index e76a4da..024e1e2 100644
--- a/libexec/rtld-elf/rtld_lock.c
+++ b/libexec/rtld-elf/rtld_lock.c
@@ -259,7 +259,7 @@ lock_restart_for_upgrade(RtldLockState *lockstate)
case RTLD_LOCK_WLOCKED:
break;
case RTLD_LOCK_RLOCKED:
- longjmp(lockstate->env, 1);
+ siglongjmp(lockstate->env, 1);
break;
default:
assert(0);
OpenPOWER on IntegriCloud