ee7649c5ac
Bionic's getauxval(...) implementation returns zero when entries are missing. Zero can be a valid value, so there is no unambiguous way of detecting an error. Since glibc 2.19, errno is set to ENOENT when an entry is missing to make it possible to detect this. Bionic should match this behavior as code in the Linux ecosystem will start relying on it to check for the presence of newly added entries. Change-Id: Ic1efe29bc45fc87489274c96c4d2193f3a7b8854 Signed-off-by: Daniel Micay <danielmicay@gmail.com>
63 lines
1.9 KiB
C++
63 lines
1.9 KiB
C++
/*
|
|
* Copyright (C) 2013 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include <errno.h>
|
|
#include <sys/cdefs.h>
|
|
#include <gtest/gtest.h>
|
|
|
|
// getauxval() was only added as of glibc version 2.16.
|
|
// See: http://lwn.net/Articles/519085/
|
|
// Don't try to compile this code on older glibc versions.
|
|
|
|
#if defined(__BIONIC__)
|
|
#define GETAUXVAL_CAN_COMPILE 1
|
|
#elif defined(__GLIBC_PREREQ)
|
|
#if __GLIBC_PREREQ(2, 16)
|
|
#define GETAUXVAL_CAN_COMPILE 1
|
|
#endif
|
|
#endif
|
|
|
|
#if defined(GETAUXVAL_CAN_COMPILE)
|
|
#include <sys/auxv.h>
|
|
#endif
|
|
|
|
TEST(getauxval, expected_values) {
|
|
#if defined(GETAUXVAL_CAN_COMPILE)
|
|
ASSERT_EQ((unsigned long int) 0, getauxval(AT_SECURE));
|
|
ASSERT_EQ(getuid(), getauxval(AT_UID));
|
|
ASSERT_EQ(geteuid(), getauxval(AT_EUID));
|
|
ASSERT_EQ(getgid(), getauxval(AT_GID));
|
|
ASSERT_EQ(getegid(), getauxval(AT_EGID));
|
|
ASSERT_EQ((unsigned long int) getpagesize(), getauxval(AT_PAGESZ));
|
|
|
|
ASSERT_NE((unsigned long int) 0, getauxval(AT_PHDR));
|
|
ASSERT_NE((unsigned long int) 0, getauxval(AT_PHNUM));
|
|
ASSERT_NE((unsigned long int) 0, getauxval(AT_ENTRY));
|
|
ASSERT_NE((unsigned long int) 0, getauxval(AT_PAGESZ));
|
|
#else
|
|
GTEST_LOG_(INFO) << "This test does nothing.\n";
|
|
#endif
|
|
}
|
|
|
|
TEST(getauxval, unexpected_values) {
|
|
#if defined(GETAUXVAL_CAN_COMPILE)
|
|
errno = 0;
|
|
ASSERT_EQ((unsigned long int) 0, getauxval(0xdeadbeef));
|
|
ASSERT_EQ(ENOENT, errno);
|
|
#else
|
|
GTEST_LOG_(INFO) << "This test does nothing.\n";
|
|
#endif
|
|
}
|