mirror of
https://git.musl-libc.org/git/musl
synced 2025-02-11 07:44:14 +03:00
remove lazy ssp initialization
now that thread pointer is initialized always, ssp canary initialization can be done unconditionally. this simplifies the ldso as it does not try to detect ssp usage, and the init function itself as it is always called exactly once. this also merges ssp init path for shared and static linking.
This commit is contained in:
parent
436d3723af
commit
2b74315d8a
2
src/env/__init_security.c
vendored
2
src/env/__init_security.c
vendored
@ -15,9 +15,7 @@ void __init_security(size_t *aux)
|
||||
struct pollfd pfd[3] = { {.fd=0}, {.fd=1}, {.fd=2} };
|
||||
int i;
|
||||
|
||||
#ifndef SHARED
|
||||
__init_ssp((void *)aux[AT_RANDOM]);
|
||||
#endif
|
||||
|
||||
if (aux[AT_UID]==aux[AT_EUID] && aux[AT_GID]==aux[AT_EGID]
|
||||
&& !aux[AT_SECURE]) return;
|
||||
|
18
src/env/__stack_chk_fail.c
vendored
18
src/env/__stack_chk_fail.c
vendored
@ -1,24 +1,16 @@
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include "pthread_impl.h"
|
||||
#include "atomic.h"
|
||||
|
||||
uintptr_t __stack_chk_guard;
|
||||
|
||||
void __init_ssp(void *entropy)
|
||||
{
|
||||
/* Here the thread pointer is used without checking whether
|
||||
* it is available; this will crash if it's not. However,
|
||||
* this function is only meant to be called if the program
|
||||
* being run uses stack protector, and in that case, it would
|
||||
* crash without a thread pointer anyway, so it's better to
|
||||
* crash early before there is state to be lost on crash. */
|
||||
pthread_t self = __pthread_self();
|
||||
uintptr_t canary;
|
||||
if (entropy) memcpy(&canary, entropy, sizeof canary);
|
||||
else canary = (uintptr_t)&canary * 1103515245;
|
||||
a_cas_l(&__stack_chk_guard, 0, canary);
|
||||
self->canary = __stack_chk_guard;
|
||||
if (entropy) memcpy(&__stack_chk_guard, entropy, sizeof(uintptr_t));
|
||||
else __stack_chk_guard = (uintptr_t)&__stack_chk_guard * 1103515245;
|
||||
|
||||
if (libc.has_thread_pointer)
|
||||
__pthread_self()->canary = __stack_chk_guard;
|
||||
}
|
||||
|
||||
void __stack_chk_fail(void)
|
||||
|
@ -91,7 +91,6 @@ struct symdef {
|
||||
|
||||
#include "reloc.h"
|
||||
|
||||
void __init_ssp(size_t *);
|
||||
int __init_tp(void *);
|
||||
void __init_libc(char **, char *);
|
||||
|
||||
@ -100,7 +99,6 @@ const char *__libc_get_version(void);
|
||||
static struct dso *head, *tail, *ldso, *fini_head;
|
||||
static char *env_path, *sys_path;
|
||||
static unsigned long long gencnt;
|
||||
static int ssp_used;
|
||||
static int runtime;
|
||||
static int ldd_mode;
|
||||
static int ldso_fail;
|
||||
@ -201,13 +199,6 @@ static struct symdef find_sym(struct dso *dso, const char *s, int need_def)
|
||||
{
|
||||
uint32_t h = 0, gh = 0;
|
||||
struct symdef def = {0};
|
||||
if (dso->ghashtab) {
|
||||
gh = gnu_hash(s);
|
||||
if (gh == 0x1f4039c9 && !strcmp(s, "__stack_chk_fail")) ssp_used = 1;
|
||||
} else {
|
||||
h = sysv_hash(s);
|
||||
if (h == 0x595a4cc && !strcmp(s, "__stack_chk_fail")) ssp_used = 1;
|
||||
}
|
||||
for (; dso; dso=dso->next) {
|
||||
Sym *sym;
|
||||
if (!dso->global) continue;
|
||||
@ -1203,7 +1194,6 @@ void *__dynlink(int argc, char **argv)
|
||||
debug.state = 0;
|
||||
_dl_debug_state();
|
||||
|
||||
if (ssp_used) __init_ssp((void *)aux[AT_RANDOM]);
|
||||
__init_libc(envp, argv[0]);
|
||||
atexit(do_fini);
|
||||
errno = 0;
|
||||
@ -1285,9 +1275,6 @@ void *dlopen(const char *file, int mode)
|
||||
}
|
||||
|
||||
update_tls_size();
|
||||
|
||||
if (ssp_used) __init_ssp(libc.auxv);
|
||||
|
||||
_dl_debug_state();
|
||||
orig_tail = tail;
|
||||
end:
|
||||
|
Loading…
x
Reference in New Issue
Block a user