ashmem: ensure ashmem fds are CLOEXEC.
Fix the memfd_create(2) path and add the missing unit test. Bug: https://issuetracker.google.com/165667331 Test: treehugger Change-Id: Ibb5c1d0f9d7caba1df04d1f03e82e55026d9f86a
This commit is contained in:
parent
6233b23918
commit
790ef05793
2 changed files with 12 additions and 3 deletions
|
@ -159,9 +159,11 @@ static bool __has_memfd_support() {
|
|||
return false;
|
||||
}
|
||||
|
||||
/* Check if kernel support exists, otherwise fall back to ashmem */
|
||||
// Check if kernel support exists, otherwise fall back to ashmem.
|
||||
// This code needs to build on old API levels, so we can't use the libc
|
||||
// wrapper.
|
||||
android::base::unique_fd fd(
|
||||
syscall(__NR_memfd_create, "test_android_memfd", MFD_ALLOW_SEALING));
|
||||
syscall(__NR_memfd_create, "test_android_memfd", MFD_CLOEXEC | MFD_ALLOW_SEALING));
|
||||
if (fd == -1) {
|
||||
ALOGE("memfd_create failed: %s, no memfd support.\n", strerror(errno));
|
||||
return false;
|
||||
|
@ -333,7 +335,9 @@ int ashmem_valid(int fd)
|
|||
}
|
||||
|
||||
static int memfd_create_region(const char* name, size_t size) {
|
||||
android::base::unique_fd fd(syscall(__NR_memfd_create, name, MFD_ALLOW_SEALING));
|
||||
// This code needs to build on old API levels, so we can't use the libc
|
||||
// wrapper.
|
||||
android::base::unique_fd fd(syscall(__NR_memfd_create, name, MFD_CLOEXEC | MFD_ALLOW_SEALING));
|
||||
|
||||
if (fd == -1) {
|
||||
ALOGE("memfd_create(%s, %zd) failed: %s\n", name, size, strerror(errno));
|
||||
|
|
|
@ -35,6 +35,11 @@ void TestCreateRegion(size_t size, unique_fd &fd, int prot) {
|
|||
ASSERT_TRUE(ashmem_valid(fd));
|
||||
ASSERT_EQ(size, static_cast<size_t>(ashmem_get_size_region(fd)));
|
||||
ASSERT_EQ(0, ashmem_set_prot_region(fd, prot));
|
||||
|
||||
// We've been inconsistent historically about whether or not these file
|
||||
// descriptors were CLOEXEC. Make sure we're consistent going forward.
|
||||
// https://issuetracker.google.com/165667331
|
||||
ASSERT_EQ(FD_CLOEXEC, (fcntl(fd, F_GETFD) & FD_CLOEXEC));
|
||||
}
|
||||
|
||||
void TestMmap(const unique_fd& fd, size_t size, int prot, void** region, off_t off = 0) {
|
||||
|
|
Loading…
Reference in a new issue