__init_security.c 761 B

123456789101112131415161718192021222324252627282930313233343536
  1. #include <stddef.h>
  2. #include <elf.h>
  3. #include <poll.h>
  4. #include <fcntl.h>
  5. #include "syscall.h"
  6. #include "libc.h"
  7. #include "atomic.h"
  8. #define AUX_CNT 24
  9. static void dummy(size_t *auxv)
  10. {
  11. }
  12. weak_alias(dummy, __init_ssp);
  13. void __init_security(size_t *auxv)
  14. {
  15. size_t i, aux[AUX_CNT] = { 0 };
  16. struct pollfd pfd[3] = { {.fd=0}, {.fd=1}, {.fd=2} };
  17. #ifndef SHARED
  18. __init_ssp(auxv);
  19. #endif
  20. for (; auxv[0]; auxv+=2) if (auxv[0]<AUX_CNT) aux[auxv[0]] = auxv[1];
  21. __hwcap = aux[AT_HWCAP];
  22. if (aux[AT_UID]==aux[AT_EUID] && aux[AT_GID]==aux[AT_EGID]
  23. && !aux[AT_SECURE]) return;
  24. __syscall(SYS_poll, pfd, 3, 0);
  25. for (i=0; i<3; i++)
  26. if (pfd[i].revents&POLLNVAL)
  27. if (__syscall(SYS_open, "/dev/null", O_RDWR|O_LARGEFILE)<0)
  28. a_crash();
  29. libc.secure = 1;
  30. }