mirror of
https://github.com/fluencelabs/musl
synced 2025-05-31 16:41:36 +00:00
the code in __libc_start_main is now responsible for parsing auxv, rather than duplicating the parsing all over the place. this should shave off a few cycles and some code size. __init_libc is left as an external-linkage function despite the fact that it could be static, to prevent it from being inlined and permanently wasting stack space when main is called. a few other minor changes are included, like eliminating per-thread ssp canaries (they were likely broken when combined with certain dlopen usages, and completely unnecessary) and some other unnecessary checks. since this code gets linked into every program, it should be as small and simple as possible.
32 lines
629 B
C
32 lines
629 B
C
#include <stddef.h>
|
|
#include <elf.h>
|
|
#include <poll.h>
|
|
#include <fcntl.h>
|
|
#include "syscall.h"
|
|
#include "libc.h"
|
|
#include "atomic.h"
|
|
|
|
static void dummy(void *ent)
|
|
{
|
|
}
|
|
weak_alias(dummy, __init_ssp);
|
|
|
|
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;
|
|
|
|
__syscall(SYS_poll, pfd, 3, 0);
|
|
for (i=0; i<3; i++) if (pfd[i].revents&POLLNVAL)
|
|
if (__syscall(SYS_open, "/dev/null", O_RDWR|O_LARGEFILE)<0)
|
|
a_crash();
|
|
libc.secure = 1;
|
|
}
|