X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fenv%2F__libc_start_main.c;h=5c79be28f0b5c8205a53ad1f23510b57da9ca7d4;hb=c1020cf21e7c09cf313c98b69d5c5af8f3895502;hp=ac37492298520cea05a4fcdcd7cd513dd91aa885;hpb=7e8b0761e57266f40b8d51105b84c50e504e89c5;p=musl diff --git a/src/env/__libc_start_main.c b/src/env/__libc_start_main.c index ac374922..5c79be28 100644 --- a/src/env/__libc_start_main.c +++ b/src/env/__libc_start_main.c @@ -1,20 +1,23 @@ #include +#include +#include +#include +#include "syscall.h" +#include "atomic.h" #include "libc.h" void __init_tls(size_t *); -void __init_security(size_t *); -#ifndef SHARED -static void dummy() {} +static void dummy(void) {} weak_alias(dummy, _init); -extern void (*const __init_array_start)() __attribute__((weak)); -extern void (*const __init_array_end)() __attribute__((weak)); -#endif -#define AUX_CNT 38 +__attribute__((__weak__, __visibility__("hidden"))) +extern void (*const __init_array_start)(void), (*const __init_array_end)(void); -extern size_t __hwcap, __sysinfo; -extern char *__progname, *__progname_full; +static void dummy1(void *p) {} +weak_alias(dummy1, __init_ssp); + +#define AUX_CNT 38 void __init_libc(char **envp, char *pn) { @@ -33,22 +36,41 @@ void __init_libc(char **envp, char *pn) } __init_tls(aux); - __init_security(aux); + __init_ssp((void *)aux[AT_RANDOM]); + + if (aux[AT_UID]==aux[AT_EUID] && aux[AT_GID]==aux[AT_EGID] + && !aux[AT_SECURE]) return; + + struct pollfd pfd[3] = { {.fd=0}, {.fd=1}, {.fd=2} }; +#ifdef SYS_poll + __syscall(SYS_poll, pfd, 3, 0); +#else + __syscall(SYS_ppoll, pfd, 3, &(struct timespec){0}, 0, _NSIG/8); +#endif + for (i=0; i<3; i++) if (pfd[i].revents&POLLNVAL) + if (__sys_open("/dev/null", O_RDWR)<0) + a_crash(); + libc.secure = 1; } -int __libc_start_main(int (*main)(int,char **,char **), int argc, char **argv) +static void libc_start_init(void) { - char **envp = argv+argc+1; - -#ifndef SHARED - __init_libc(envp, argv[0]); _init(); uintptr_t a = (uintptr_t)&__init_array_start; for (; a<(uintptr_t)&__init_array_end; a+=sizeof(void(*)())) (*(void (**)())a)(); -#endif +} + +weak_alias(libc_start_init, __libc_start_init); + +int __libc_start_main(int (*main)(int,char **,char **), int argc, char **argv) +{ + char **envp = argv+argc+1; + + __init_libc(envp, argv[0]); + __libc_start_init(); - /* Pass control to to application */ + /* Pass control to the application */ exit(main(argc, argv, envp)); return 0; }