Test cached PID using getpid instead of pthread_getattr_np.
Previously, we tested that glibc's cached PID was correct by relying on an assert inside of pthread_getattr_np. This relies on a fairly implementation-specific detail of pthread_getattr_np and is also problematic, as glibc's pthread_getattr_np relies on reading /proc/self/maps when called from the main thread (but the test chroots). This change inspects the cached PID more directly using getpid instead. BUG=646191 Review-Url: https://codereview.chromium.org/2474703003 Cr-Commit-Position: refs/heads/master@{#429369}
This commit is contained in:
@@ -246,18 +246,19 @@ void SignalHandler(int sig) {
|
|||||||
signal_handler_called = 1;
|
signal_handler_called = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// glibc (and some other libcs) caches the PID and TID in TLS. This test
|
||||||
|
// verifies that these values are correct after DropFilesystemAccess.
|
||||||
// Disabled on ASAN because of crbug.com/451603.
|
// Disabled on ASAN because of crbug.com/451603.
|
||||||
SANDBOX_TEST(Credentials, DISABLE_ON_ASAN(DropFileSystemAccessPreservesTLS)) {
|
SANDBOX_TEST(Credentials, DISABLE_ON_ASAN(DropFileSystemAccessPreservesTLS)) {
|
||||||
// Probably missing kernel support.
|
// Probably missing kernel support.
|
||||||
if (!Credentials::MoveToNewUserNS()) return;
|
if (!Credentials::MoveToNewUserNS()) return;
|
||||||
CHECK(Credentials::DropFileSystemAccess(ProcUtil::OpenProc().get()));
|
CHECK(Credentials::DropFileSystemAccess(ProcUtil::OpenProc().get()));
|
||||||
|
|
||||||
// In glibc, pthread_getattr_np makes an assertion about the cached PID/TID in
|
// The libc getpid implementation may return a cached PID. Ensure that
|
||||||
// TLS.
|
// it matches the PID returned from the getpid system call.
|
||||||
pthread_attr_t attr;
|
CHECK_EQ(sys_getpid(), getpid());
|
||||||
EXPECT_EQ(0, pthread_getattr_np(pthread_self(), &attr));
|
|
||||||
|
|
||||||
// raise also uses the cached TID in glibc.
|
// raise uses the cached TID in glibc.
|
||||||
struct sigaction action = {};
|
struct sigaction action = {};
|
||||||
action.sa_handler = &SignalHandler;
|
action.sa_handler = &SignalHandler;
|
||||||
PCHECK(sigaction(SIGUSR1, &action, nullptr) == 0);
|
PCHECK(sigaction(SIGUSR1, &action, nullptr) == 0);
|
||||||
|
Reference in New Issue
Block a user