summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2014-07-17 22:01:52 -0400
committerRich Felker <dalias@aerifal.cx>2014-07-17 22:01:52 -0400
commit7bece9c2095ee81f14b1088f6b0ba2f37fecb283 (patch)
tree2d1b7602c410829163adc83a647f3d656186d9e8
parent5cc187215681c2fc1563ad5136c389249aa3f70e (diff)
downloadmusl-7bece9c2095ee81f14b1088f6b0ba2f37fecb283.tar.gz
musl-7bece9c2095ee81f14b1088f6b0ba2f37fecb283.tar.bz2
musl-7bece9c2095ee81f14b1088f6b0ba2f37fecb283.tar.xz
musl-7bece9c2095ee81f14b1088f6b0ba2f37fecb283.zip
provide getauxval(AT_SECURE) even if it is missing from the aux vector
this could happen on 2.4-series linux kernels that predate AT_SECURE and possibly on other kernels that are emulating the linux syscall API but not providing AT_SECURE in the aux vector at startup. in principle applications should be checking errno anyway, but this does not really work. to be secure, the caller would have to treat ENOENT (indeterminate result) as possibly-suid and thereby disable functionality in the typical non-suid usage case. and since glibc only runs on kernels that provide AT_SECURE, applications written to the glibc getauxval API might simply assume it succeeds.
-rw-r--r--src/misc/getauxval.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/src/misc/getauxval.c b/src/misc/getauxval.c
index 5ac8b3d2..b846c80f 100644
--- a/src/misc/getauxval.c
+++ b/src/misc/getauxval.c
@@ -5,6 +5,7 @@
unsigned long getauxval(unsigned long item)
{
size_t *auxv = libc.auxv;
+ if (item == AT_SECURE) return libc.secure;
for (; *auxv; auxv+=2)
if (*auxv==item) return auxv[1];
errno = ENOENT;