asterinas/test/src/apps/pseudofs/memfd_access_err.c

87 lines
2.2 KiB
C

// SPDX-License-Identifier: MPL-2.0
#define _GNU_SOURCE
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <linux/memfd.h>
#include <sys/ioctl.h>
#include <linux/fs.h>
#include "../test.h"
char memfd_path[64];
FN_SETUP(create)
{
int fd = CHECK(memfd_create("test_memfd", MFD_ALLOW_SEALING));
CHECK(ftruncate(fd, 4096));
CHECK_WITH(snprintf(memfd_path, sizeof(memfd_path), "/proc/self/fd/%d",
fd),
_ret > 0 && _ret < sizeof(memfd_path));
}
END_SETUP()
FN_TEST(path)
{
int fd = TEST_SUCC(open(memfd_path, O_PATH | O_RDWR));
char buf[10];
int flags =
TEST_RES(fcntl(fd, F_GETFL), (_ret & O_ACCMODE) == O_RDONLY);
TEST_ERRNO(fcntl(fd, F_ADD_SEALS, F_SEAL_SEAL), EBADF);
TEST_ERRNO(fcntl(fd, F_GET_SEALS), EBADF);
TEST_ERRNO(read(fd, buf, sizeof(buf)), EBADF);
TEST_ERRNO(write(fd, buf, sizeof(buf)), EBADF);
TEST_ERRNO(ftruncate(fd, 0), EBADF);
TEST_ERRNO(lseek(fd, 0, SEEK_SET), EBADF);
TEST_ERRNO(fallocate(fd, 0, 0, 100), EBADF);
TEST_ERRNO(ioctl(fd, TCGETS), EBADF);
TEST_ERRNO(mmap(NULL, 4096, PROT_READ, MAP_PRIVATE, fd, 0), EBADF);
TEST_SUCC(close(fd));
}
END_TEST()
FN_TEST(readonly)
{
int fd = TEST_SUCC(open(memfd_path, O_RDONLY));
char buf[10];
TEST_ERRNO(fcntl(fd, F_ADD_SEALS, F_SEAL_SEAL), EPERM);
TEST_RES(fcntl(fd, F_GET_SEALS), _ret == 0);
TEST_SUCC(read(fd, buf, sizeof(buf)));
TEST_ERRNO(write(fd, buf, sizeof(buf)), EBADF);
TEST_ERRNO(ftruncate(fd, 0), EINVAL);
TEST_SUCC(lseek(fd, 0, SEEK_SET));
TEST_ERRNO(fallocate(fd, 0, 0, 100), EBADF);
TEST_ERRNO(ioctl(fd, TCGETS), ENOTTY);
TEST_SUCC(mmap(NULL, 4096, PROT_READ, MAP_PRIVATE, fd, 0));
TEST_SUCC(close(fd));
}
END_TEST()
FN_TEST(writeonly)
{
int fd = TEST_SUCC(open(memfd_path, O_WRONLY));
char buf[10];
TEST_SUCC(fcntl(fd, F_ADD_SEALS, F_SEAL_SEAL));
TEST_RES(fcntl(fd, F_GET_SEALS), _ret == F_SEAL_SEAL);
TEST_ERRNO(read(fd, buf, sizeof(buf)), EBADF);
TEST_SUCC(write(fd, buf, sizeof(buf)));
TEST_SUCC(ftruncate(fd, 0));
TEST_SUCC(lseek(fd, 0, SEEK_SET));
TEST_SUCC(fallocate(fd, 0, 0, 100));
TEST_ERRNO(ioctl(fd, TCGETS), ENOTTY);
TEST_ERRNO(mmap(NULL, 4096, PROT_READ, MAP_PRIVATE, fd, 0), EACCES);
TEST_SUCC(close(fd));
}
END_TEST()