Add regression tests for recent issues

This commit is contained in:
Ruihan Li 2026-01-26 01:37:28 +08:00
parent b7ae738310
commit 63d540d7fc
3 changed files with 84 additions and 0 deletions

View File

@ -0,0 +1,63 @@
// SPDX-License-Identifier: MPL-2.0
#define _GNU_SOURCE
#include "../test.h"
#include <stdint.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
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()

View File

@ -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);

View File

@ -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