Add regression tests for recent issues
This commit is contained in:
parent
a3314c6432
commit
5499436807
|
|
@ -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()
|
||||||
|
|
@ -32,7 +32,11 @@ FN_TEST(overflow_len)
|
||||||
MAP_PRIVATE | MAP_ANONYMOUS, 0, 0),
|
MAP_PRIVATE | MAP_ANONYMOUS, 0, 0),
|
||||||
ENOMEM);
|
ENOMEM);
|
||||||
TEST_ERRNO(mremap(valid_addr, ~(size_t)1, PAGE_SIZE, 0), EINVAL);
|
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, 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(munmap(valid_addr, ~(size_t)1), EINVAL);
|
||||||
TEST_ERRNO(mprotect(valid_addr, ~(size_t)1, PROT_READ), ENOMEM);
|
TEST_ERRNO(mprotect(valid_addr, ~(size_t)1, PROT_READ), ENOMEM);
|
||||||
TEST_ERRNO(madvise(valid_addr, ~(size_t)1, MADV_NORMAL), EINVAL);
|
TEST_ERRNO(madvise(valid_addr, ~(size_t)1, MADV_NORMAL), EINVAL);
|
||||||
|
|
@ -52,7 +56,9 @@ FN_TEST(zero_len)
|
||||||
0, 0),
|
0, 0),
|
||||||
EINVAL);
|
EINVAL);
|
||||||
TEST_ERRNO(mremap(valid_addr, 0, PAGE_SIZE, 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, 0), EINVAL);
|
||||||
|
TEST_ERRNO(mremap(valid_addr, PAGE_SIZE, 0, MREMAP_MAYMOVE), EINVAL);
|
||||||
TEST_ERRNO(munmap(valid_addr, 0), EINVAL);
|
TEST_ERRNO(munmap(valid_addr, 0), EINVAL);
|
||||||
TEST_SUCC(mprotect(valid_addr, 0, PROT_READ));
|
TEST_SUCC(mprotect(valid_addr, 0, PROT_READ));
|
||||||
TEST_SUCC(madvise(valid_addr, 0, MADV_NORMAL));
|
TEST_SUCC(madvise(valid_addr, 0, MADV_NORMAL));
|
||||||
|
|
@ -71,7 +77,18 @@ FN_TEST(overflow_addr)
|
||||||
MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, 0, 0),
|
MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, 0, 0),
|
||||||
ENOMEM);
|
ENOMEM);
|
||||||
TEST_ERRNO(mremap(valid_addr, len, PAGE_SIZE, 0), EINVAL);
|
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);
|
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(munmap(valid_addr, len), EINVAL);
|
||||||
TEST_ERRNO(mprotect(valid_addr, len, PROT_READ), ENOMEM);
|
TEST_ERRNO(mprotect(valid_addr, len, PROT_READ), ENOMEM);
|
||||||
TEST_ERRNO(madvise(valid_addr, len, MADV_NORMAL), EINVAL);
|
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),
|
MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, 0, 0),
|
||||||
EPERM);
|
EPERM);
|
||||||
TEST_ERRNO(mremap(addr, PAGE_SIZE, PAGE_SIZE, 0), EFAULT);
|
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),
|
TEST_ERRNO(mremap(valid_addr, PAGE_SIZE, PAGE_SIZE, MREMAP_FIXED, addr),
|
||||||
EINVAL);
|
EINVAL);
|
||||||
TEST_SUCC(munmap(addr, PAGE_SIZE));
|
TEST_SUCC(munmap(addr, PAGE_SIZE));
|
||||||
|
|
@ -103,6 +121,8 @@ FN_TEST(unaligned_addr)
|
||||||
MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, 0, 0),
|
MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, 0, 0),
|
||||||
EINVAL);
|
EINVAL);
|
||||||
TEST_ERRNO(mremap(valid_addr + 1, PAGE_SIZE, PAGE_SIZE, 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,
|
TEST_ERRNO(mremap(valid_addr, PAGE_SIZE, PAGE_SIZE, MREMAP_FIXED,
|
||||||
valid_addr + 1),
|
valid_addr + 1),
|
||||||
EINVAL);
|
EINVAL);
|
||||||
|
|
|
||||||
|
|
@ -105,6 +105,7 @@ pipe/short_rw
|
||||||
epoll/epoll_err
|
epoll/epoll_err
|
||||||
epoll/poll_err
|
epoll/poll_err
|
||||||
file_io/access_err
|
file_io/access_err
|
||||||
|
file_io/file_err
|
||||||
file_io/iovec_err
|
file_io/iovec_err
|
||||||
devfs/full
|
devfs/full
|
||||||
devfs/random
|
devfs/random
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue