summaryrefslogtreecommitdiff
path: root/elf/dl-support.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-05-06 06:34:21 +0000
committerUlrich Drepper <drepper@redhat.com>2003-05-06 06:34:21 +0000
commitbe4d80380a87ab758aecb4e25695b264d36156da (patch)
tree1eff92d850952d6f9ff8e6e9a1aea83022783092 /elf/dl-support.c
parent9946f75ad4b3183a09c3f3ff1c3554613fb4f485 (diff)
Update.
* sysdeps/generic/enbl-secure.c (__libc_enable_secure_decided): New variable. (__libc_init_secure): Don't do anything if __libc_enable_secure_decided is nonzero. * include/unistd.h: Declare __libc_enable_secure_decided. * elf/dl-support.c (_dl_aux_init): Recognize AT_UID, AT_EUID, AT_GID, and AT_EGID. If all found, set __libc_enable_secure and __libc_enable_secure_decided.
Diffstat (limited to 'elf/dl-support.c')
-rw-r--r--elf/dl-support.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/elf/dl-support.c b/elf/dl-support.c
index 2ff3d2f905..0d6ce6a12b 100644
--- a/elf/dl-support.c
+++ b/elf/dl-support.c
@@ -148,6 +148,10 @@ void
internal_function
_dl_aux_init (ElfW(auxv_t) *av)
{
+ int seen = 0;
+ uid_t uid = 0;
+ gid_t gid = 0;
+
for (; av->a_type != AT_NULL; ++av)
switch (av->a_type)
{
@@ -168,7 +172,28 @@ _dl_aux_init (ElfW(auxv_t) *av)
GL(dl_sysinfo) = av->a_un.a_val;
break;
#endif
+ case AT_UID:
+ uid ^= av->a_un.a_val;
+ seen |= 1;
+ break;
+ case AT_EUID:
+ uid ^= av->a_un.a_val;
+ seen |= 2;
+ break;
+ case AT_GID:
+ gid ^= av->a_un.a_val;
+ seen |= 4;
+ break;
+ case AT_EGID:
+ gid ^= av->a_un.a_val;
+ seen |= 8;
+ break;
}
+ if (seen == 0xf)
+ {
+ __libc_enable_secure = uid != 0 || gid != 0;
+ __libc_enable_secure_decided = 1;
+ }
}
#endif