X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fenv%2F__libc_start_main.c;h=10e559096a703202070da2eb95157487f588b937;hb=546f6b322bcafa2452925c19f9607d9689c75f95;hp=539f72e55c2ba52357cf167687b820088978cfdb;hpb=9b52ab1c9a44b62236089ab0272801d049bc5b1e;p=musl diff --git a/src/env/__libc_start_main.c b/src/env/__libc_start_main.c index 539f72e5..10e55909 100644 --- a/src/env/__libc_start_main.c +++ b/src/env/__libc_start_main.c @@ -1,8 +1,12 @@ #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() {} @@ -19,6 +23,9 @@ weak_alias(dummy1, __init_ssp); extern size_t __hwcap, __sysinfo; extern char *__progname, *__progname_full; +#ifndef SHARED +static +#endif void __init_libc(char **envp, char *pn) { size_t i, *auxv, aux[AUX_CNT] = { 0 }; @@ -37,7 +44,20 @@ void __init_libc(char **envp, char *pn) __init_tls(aux); __init_ssp((void *)aux[AT_RANDOM]); - __init_security(aux); + + 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) @@ -52,7 +72,7 @@ int __libc_start_main(int (*main)(int,char **,char **), int argc, char **argv) (*(void (**)())a)(); #endif - /* Pass control to to application */ + /* Pass control to the application */ exit(main(argc, argv, envp)); return 0; }