mirror of https://gitee.com/openkylin/linux.git
selftests/memfd: add tests for F_SEAL_FUTURE_WRITE seal
Add tests to verify sealing memfds with the F_SEAL_FUTURE_WRITE works as expected. Link: http://lkml.kernel.org/r/20190112203816.85534-3-joel@joelfernandes.org Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org> Reviewed-by: Shuah Khan <shuah@kernel.org> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Andy Lutomirski <luto@kernel.org> Cc: Hugh Dickins <hughd@google.com> Cc: Jann Horn <jannh@google.com> Cc: J. Bruce Fields <bfields@fieldses.org> Cc: Jeff Layton <jlayton@kernel.org> Cc: John Stultz <john.stultz@linaro.org> Cc: Marc-Andr Lureau <marcandre.lureau@redhat.com> Cc: Matthew Wilcox <willy@infradead.org> Cc: Mike Kravetz <mike.kravetz@oracle.com> Cc: Minchan Kim <minchan@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
ab3948f58f
commit
544029862c
|
@ -54,6 +54,22 @@ static int mfd_assert_new(const char *name, loff_t sz, unsigned int flags)
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int mfd_assert_reopen_fd(int fd_in)
|
||||||
|
{
|
||||||
|
int r, fd;
|
||||||
|
char path[100];
|
||||||
|
|
||||||
|
sprintf(path, "/proc/self/fd/%d", fd_in);
|
||||||
|
|
||||||
|
fd = open(path, O_RDWR);
|
||||||
|
if (fd < 0) {
|
||||||
|
printf("re-open of existing fd %d failed\n", fd_in);
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
|
||||||
static void mfd_fail_new(const char *name, unsigned int flags)
|
static void mfd_fail_new(const char *name, unsigned int flags)
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
|
@ -255,6 +271,25 @@ static void mfd_assert_read(int fd)
|
||||||
munmap(p, mfd_def_size);
|
munmap(p, mfd_def_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Test that PROT_READ + MAP_SHARED mappings work. */
|
||||||
|
static void mfd_assert_read_shared(int fd)
|
||||||
|
{
|
||||||
|
void *p;
|
||||||
|
|
||||||
|
/* verify PROT_READ and MAP_SHARED *is* allowed */
|
||||||
|
p = mmap(NULL,
|
||||||
|
mfd_def_size,
|
||||||
|
PROT_READ,
|
||||||
|
MAP_SHARED,
|
||||||
|
fd,
|
||||||
|
0);
|
||||||
|
if (p == MAP_FAILED) {
|
||||||
|
printf("mmap() failed: %m\n");
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
munmap(p, mfd_def_size);
|
||||||
|
}
|
||||||
|
|
||||||
static void mfd_assert_write(int fd)
|
static void mfd_assert_write(int fd)
|
||||||
{
|
{
|
||||||
ssize_t l;
|
ssize_t l;
|
||||||
|
@ -692,6 +727,44 @@ static void test_seal_write(void)
|
||||||
close(fd);
|
close(fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Test SEAL_FUTURE_WRITE
|
||||||
|
* Test whether SEAL_FUTURE_WRITE actually prevents modifications.
|
||||||
|
*/
|
||||||
|
static void test_seal_future_write(void)
|
||||||
|
{
|
||||||
|
int fd, fd2;
|
||||||
|
void *p;
|
||||||
|
|
||||||
|
printf("%s SEAL-FUTURE-WRITE\n", memfd_str);
|
||||||
|
|
||||||
|
fd = mfd_assert_new("kern_memfd_seal_future_write",
|
||||||
|
mfd_def_size,
|
||||||
|
MFD_CLOEXEC | MFD_ALLOW_SEALING);
|
||||||
|
|
||||||
|
p = mfd_assert_mmap_shared(fd);
|
||||||
|
|
||||||
|
mfd_assert_has_seals(fd, 0);
|
||||||
|
|
||||||
|
mfd_assert_add_seals(fd, F_SEAL_FUTURE_WRITE);
|
||||||
|
mfd_assert_has_seals(fd, F_SEAL_FUTURE_WRITE);
|
||||||
|
|
||||||
|
/* read should pass, writes should fail */
|
||||||
|
mfd_assert_read(fd);
|
||||||
|
mfd_assert_read_shared(fd);
|
||||||
|
mfd_fail_write(fd);
|
||||||
|
|
||||||
|
fd2 = mfd_assert_reopen_fd(fd);
|
||||||
|
/* read should pass, writes should still fail */
|
||||||
|
mfd_assert_read(fd2);
|
||||||
|
mfd_assert_read_shared(fd2);
|
||||||
|
mfd_fail_write(fd2);
|
||||||
|
|
||||||
|
munmap(p, mfd_def_size);
|
||||||
|
close(fd2);
|
||||||
|
close(fd);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Test SEAL_SHRINK
|
* Test SEAL_SHRINK
|
||||||
* Test whether SEAL_SHRINK actually prevents shrinking
|
* Test whether SEAL_SHRINK actually prevents shrinking
|
||||||
|
@ -945,6 +1018,7 @@ int main(int argc, char **argv)
|
||||||
test_basic();
|
test_basic();
|
||||||
|
|
||||||
test_seal_write();
|
test_seal_write();
|
||||||
|
test_seal_future_write();
|
||||||
test_seal_shrink();
|
test_seal_shrink();
|
||||||
test_seal_grow();
|
test_seal_grow();
|
||||||
test_seal_resize();
|
test_seal_resize();
|
||||||
|
|
Loading…
Reference in New Issue