summary refs log tree commit diff
path: root/elf
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
parent9946f75ad4b3183a09c3f3ff1c3554613fb4f485 (diff)
downloadglibc-be4d80380a87ab758aecb4e25695b264d36156da.tar.gz
glibc-be4d80380a87ab758aecb4e25695b264d36156da.tar.xz
glibc-be4d80380a87ab758aecb4e25695b264d36156da.zip
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')
-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