The patch titled Subject: selftests/memfd: modify tests for F_SEAL_FUTURE_WRITE seal has been removed from the -mm tree. Its filename was selftests-memfd-add-tests-for-f_seal_future_write-seal-fix.patch This patch was dropped because it was folded into selftests-memfd-add-tests-for-f_seal_future_write-seal.patch ------------------------------------------------------ From: "Joel Fernandes (Google)" <joel@xxxxxxxxxxxxxxxxx> Subject: selftests/memfd: modify tests for F_SEAL_FUTURE_WRITE seal Modify the tests for F_SEAL_FUTURE_WRITE based on the changes introduced in previous patch. Also add a test to make sure the reopen issue pointed by Jann Horn [1] is fixed. [1] https://lore.kernel.org/lkml/CAG48ez1h=v-JYnDw81HaYJzOfrNhwYksxmc2r=cJvdQVgYM+NA@xxxxxxxxxxxxxx/ Link: http://lkml.kernel.org/r/20181120052137.74317-2-joel@xxxxxxxxxxxxxxxxx Signed-off-by: Joel Fernandes (Google) <joel@xxxxxxxxxxxxxxxxx> Cc: Jann Horn <jannh@xxxxxxxxxx> Cc: Al Viro <viro@xxxxxxxxxxxxxxxxxx> Cc: Andy Lutomirski <luto@xxxxxxxxxx> Cc: Christoph Hellwig <hch@xxxxxxxxxxxxx> Cc: Daniel Colascione <dancol@xxxxxxxxxx> Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> Cc: J. Bruce Fields <bfields@xxxxxxxxxxxx> Cc: Jeff Layton <jlayton@xxxxxxxxxx> Cc: John Reck <jreck@xxxxxxxxxx> Cc: John Stultz <john.stultz@xxxxxxxxxx> Cc: Khalid Aziz <khalid.aziz@xxxxxxxxxx> Cc: Lei Yang <Lei.Yang@xxxxxxxxxxxxx> Cc: Marc-Andr Lureau <marcandre.lureau@xxxxxxxxxx> Cc: Mike Kravetz <mike.kravetz@xxxxxxxxxx> Cc: Minchan Kim <minchan@xxxxxxxxxx> Cc: Shuah Khan <shuah@xxxxxxxxxx> Cc: Todd Kjos <tkjos@xxxxxxxxxx> Cc: Valdis Kletnieks <valdis.kletnieks@xxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- tools/testing/selftests/memfd/memfd_test.c | 88 +++++++++---------- 1 file changed, 44 insertions(+), 44 deletions(-) --- a/tools/testing/selftests/memfd/memfd_test.c~selftests-memfd-add-tests-for-f_seal_future_write-seal-fix +++ a/tools/testing/selftests/memfd/memfd_test.c @@ -54,6 +54,22 @@ static int mfd_assert_new(const char *na 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) { int r; @@ -255,6 +271,25 @@ static void mfd_assert_read(int fd) 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) { ssize_t l; @@ -698,7 +733,7 @@ static void test_seal_write(void) */ static void test_seal_future_write(void) { - int fd; + int fd, fd2; void *p; printf("%s SEAL-FUTURE-WRITE\n", memfd_str); @@ -710,58 +745,23 @@ static void test_seal_future_write(void) p = mfd_assert_mmap_shared(fd); mfd_assert_has_seals(fd, 0); - /* Not adding grow/shrink seals makes the future write - * seal fail to get added - */ - mfd_fail_add_seals(fd, F_SEAL_FUTURE_WRITE); - - mfd_assert_add_seals(fd, F_SEAL_GROW); - mfd_assert_has_seals(fd, F_SEAL_GROW); - - /* Should still fail since shrink seal has - * not yet been added - */ - mfd_fail_add_seals(fd, F_SEAL_FUTURE_WRITE); - mfd_assert_add_seals(fd, F_SEAL_SHRINK); - mfd_assert_has_seals(fd, F_SEAL_GROW | - F_SEAL_SHRINK); - - /* Now should succeed, also verifies that the seal - * could be added with an existing writable mmap - */ mfd_assert_add_seals(fd, F_SEAL_FUTURE_WRITE); - mfd_assert_has_seals(fd, F_SEAL_SHRINK | - F_SEAL_GROW | - 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); - munmap(p, mfd_def_size); - close(fd); - - /* Test adding all seals (grow, shrink, future write) at once */ - fd = mfd_assert_new("kern_memfd_seal_future_write2", - 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_SHRINK | - F_SEAL_GROW | - F_SEAL_FUTURE_WRITE); - mfd_assert_has_seals(fd, F_SEAL_SHRINK | - F_SEAL_GROW | - F_SEAL_FUTURE_WRITE); - - /* read should pass, writes should fail */ - mfd_assert_read(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); } _ Patches currently in -mm which might be from joel@xxxxxxxxxxxxxxxxx are mm-add-an-f_seal_future_write-seal-to-memfd.patch selftests-memfd-add-tests-for-f_seal_future_write-seal.patch