diff --git a/test/initramfs/src/apps/file_io/file_err.c b/test/initramfs/src/apps/file_io/file_err.c new file mode 100644 index 000000000..1f4cd32b0 --- /dev/null +++ b/test/initramfs/src/apps/file_io/file_err.c @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: MPL-2.0 + +#define _GNU_SOURCE + +#include "../test.h" +#include +#include +#include +#include + +static int fd; + +FN_SETUP(open) +{ + fd = CHECK(open("/etc/passwd", O_RDONLY)); +} +END_SETUP() + +FN_TEST(dup_out_of_range) +{ + // `-1` is out of the allowed range for file descriptors. + TEST_ERRNO(dup2(fd, -1), EBADF); +} +END_TEST() + +FN_TEST(flock_overflow) +{ + struct flock fl; + + fl.l_type = F_RDLCK; + fl.l_whence = SEEK_SET; + + // `l_start + l_len` underflows. + fl.l_start = -1; + fl.l_len = INT64_MIN; + TEST_ERRNO(fcntl(fd, F_SETLK, &fl), EINVAL); + + // `l_start + l_len` overflows. + fl.l_start = 2; + fl.l_len = INT64_MAX; + TEST_ERRNO(fcntl(fd, F_SETLK, &fl), EOVERFLOW); +} +END_TEST() + +FN_TEST(ftruncate_large) +{ + int memfd; + + memfd = TEST_SUCC(memfd_create("test_memfd", 0)); + + // `ftruncate` can handle large expansions and shrinking. + TEST_SUCC(ftruncate(memfd, ((off_t)1) << 50)); + TEST_SUCC(ftruncate(memfd, 0)); + + TEST_SUCC(close(memfd)); +} +END_TEST() + +FN_SETUP(cleanup) +{ + CHECK(close(fd)); +} +END_SETUP() diff --git a/test/initramfs/src/apps/mmap/mmap_err.c b/test/initramfs/src/apps/mmap/mmap_err.c index 695019c6d..b285eaf83 100644 --- a/test/initramfs/src/apps/mmap/mmap_err.c +++ b/test/initramfs/src/apps/mmap/mmap_err.c @@ -32,7 +32,11 @@ FN_TEST(overflow_len) MAP_PRIVATE | MAP_ANONYMOUS, 0, 0), ENOMEM); TEST_ERRNO(mremap(valid_addr, ~(size_t)1, PAGE_SIZE, 0), EINVAL); + TEST_ERRNO(mremap(valid_addr, ~(size_t)1, PAGE_SIZE, MREMAP_MAYMOVE), + EINVAL); TEST_ERRNO(mremap(valid_addr, PAGE_SIZE, ~(size_t)1, 0), EINVAL); + TEST_ERRNO(mremap(valid_addr, PAGE_SIZE, ~(size_t)1, MREMAP_MAYMOVE), + EINVAL); TEST_ERRNO(munmap(valid_addr, ~(size_t)1), EINVAL); TEST_ERRNO(mprotect(valid_addr, ~(size_t)1, PROT_READ), ENOMEM); TEST_ERRNO(madvise(valid_addr, ~(size_t)1, MADV_NORMAL), EINVAL); @@ -52,7 +56,9 @@ FN_TEST(zero_len) 0, 0), EINVAL); TEST_ERRNO(mremap(valid_addr, 0, PAGE_SIZE, 0), EINVAL); + TEST_ERRNO(mremap(valid_addr, 0, PAGE_SIZE, MREMAP_MAYMOVE), EINVAL); TEST_ERRNO(mremap(valid_addr, PAGE_SIZE, 0, 0), EINVAL); + TEST_ERRNO(mremap(valid_addr, PAGE_SIZE, 0, MREMAP_MAYMOVE), EINVAL); TEST_ERRNO(munmap(valid_addr, 0), EINVAL); TEST_SUCC(mprotect(valid_addr, 0, PROT_READ)); TEST_SUCC(madvise(valid_addr, 0, MADV_NORMAL)); @@ -71,7 +77,18 @@ FN_TEST(overflow_addr) MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, 0, 0), ENOMEM); TEST_ERRNO(mremap(valid_addr, len, PAGE_SIZE, 0), EINVAL); + TEST_ERRNO(mremap(valid_addr, len, PAGE_SIZE, MREMAP_MAYMOVE), + EINVAL); TEST_ERRNO(mremap(valid_addr, PAGE_SIZE, len, 0), EINVAL); + // FIXME: Asterinas will return `ENOMEM` in this test, which differs + // from Linux's error code. +#ifdef __asterinas__ + TEST_ERRNO(mremap(valid_addr, PAGE_SIZE, len, MREMAP_MAYMOVE), + ENOMEM); +#else + TEST_ERRNO(mremap(valid_addr, PAGE_SIZE, len, MREMAP_MAYMOVE), + EINVAL); +#endif TEST_ERRNO(munmap(valid_addr, len), EINVAL); TEST_ERRNO(mprotect(valid_addr, len, PROT_READ), ENOMEM); TEST_ERRNO(madvise(valid_addr, len, MADV_NORMAL), EINVAL); @@ -88,6 +105,7 @@ FN_TEST(underflow_addr) MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, 0, 0), EPERM); TEST_ERRNO(mremap(addr, PAGE_SIZE, PAGE_SIZE, 0), EFAULT); + TEST_ERRNO(mremap(addr, PAGE_SIZE, PAGE_SIZE, MREMAP_MAYMOVE), EFAULT); TEST_ERRNO(mremap(valid_addr, PAGE_SIZE, PAGE_SIZE, MREMAP_FIXED, addr), EINVAL); TEST_SUCC(munmap(addr, PAGE_SIZE)); @@ -103,6 +121,8 @@ FN_TEST(unaligned_addr) MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, 0, 0), EINVAL); TEST_ERRNO(mremap(valid_addr + 1, PAGE_SIZE, PAGE_SIZE, 0), EINVAL); + TEST_ERRNO(mremap(valid_addr + 1, PAGE_SIZE, PAGE_SIZE, MREMAP_MAYMOVE), + EINVAL); TEST_ERRNO(mremap(valid_addr, PAGE_SIZE, PAGE_SIZE, MREMAP_FIXED, valid_addr + 1), EINVAL); diff --git a/test/initramfs/src/apps/scripts/fs.sh b/test/initramfs/src/apps/scripts/fs.sh index 6e0a83358..618b8370e 100755 --- a/test/initramfs/src/apps/scripts/fs.sh +++ b/test/initramfs/src/apps/scripts/fs.sh @@ -105,6 +105,7 @@ pipe/short_rw epoll/epoll_err epoll/poll_err file_io/access_err +file_io/file_err file_io/iovec_err devfs/full devfs/random