From 0ee52669acfff797d66ec0bd9feea011fd8aa1fe Mon Sep 17 00:00:00 2001 From: Andrey Vagin Date: Mon, 7 Sep 2015 22:34:40 +0300 Subject: [PATCH] zdtm: check read-only bind mounts Signed-off-by: Andrey Vagin Signed-off-by: Pavel Emelyanov --- test/zdtm.sh | 3 +- test/zdtm/live/static/Makefile | 1 + test/zdtm/live/static/mnt_ro_bind.c | 84 +++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 test/zdtm/live/static/mnt_ro_bind.c diff --git a/test/zdtm.sh b/test/zdtm.sh index f12156acf..9bbeb2a48 100755 --- a/test/zdtm.sh +++ b/test/zdtm.sh @@ -189,6 +189,7 @@ generate_test_list() ns/static/session00 ns/static/session01 ns/static/tempfs + ns/static/mnt_ro_bind ns/static/mount_paths ns/static/bind-mount static/utsname @@ -328,9 +329,9 @@ chroot-file console vt rtc -tempfs maps007 tempfs +mnt_ro_bind bind-mount mountpoints inotify_irmap diff --git a/test/zdtm/live/static/Makefile b/test/zdtm/live/static/Makefile index 537e92f90..3e78eb293 100644 --- a/test/zdtm/live/static/Makefile +++ b/test/zdtm/live/static/Makefile @@ -183,6 +183,7 @@ TST_DIR = \ overmount_fifo \ overmount_sock \ tempfs \ + mnt_ro_bind \ mount_paths \ bind-mount \ inotify00 \ diff --git a/test/zdtm/live/static/mnt_ro_bind.c b/test/zdtm/live/static/mnt_ro_bind.c new file mode 100644 index 000000000..1d9881408 --- /dev/null +++ b/test/zdtm/live/static/mnt_ro_bind.c @@ -0,0 +1,84 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "zdtmtst.h" + +const char *test_doc = "Check read-only bind-mounts"; +const char *test_author = "Andrew Vagin "; + +char *dirname; +TEST_OPTION(dirname, string, "directory name", 1); + +#define TEST_WORD "testtest" +#define TEST_WORD2 "TESTTEST" + +int main(int argc, char **argv) +{ + int fd, ret = 1; + char rw_path[PATH_MAX], ro_path[PATH_MAX], rw_f[PATH_MAX], ro_f[PATH_MAX]; + + test_init(argc, argv); + + snprintf(rw_path, sizeof(rw_path), "%s/rw", dirname); + snprintf(ro_path, sizeof(ro_path), "%s/ro", dirname); + snprintf(rw_f, sizeof(rw_f), "%s/rw/test", dirname); + snprintf(ro_f, sizeof(ro_f), "%s/ro/test", dirname); + + mkdir(dirname, 0700); + if (mount("none", dirname, "tmpfs", 0, "") < 0) { + fail("Can't mount tmpfs"); + return 1; + } + mkdir(rw_path, 0700); + mkdir(ro_path, 0700); + + if (mount("zdtm_rw", rw_path, "tmpfs", 0, "") < 0) { + fail("Can't mount tmpfs"); + return 1; + } + + if (mount(rw_path, ro_path, NULL, MS_BIND, NULL) < 0) { + fail("Can't mount tmpfs"); + return 1; + } + + if (mount(NULL, ro_path, NULL, MS_BIND | MS_REMOUNT | MS_RDONLY, NULL) < 0) { + fail("Can't mount tmpfs"); + return 1; + } + + test_daemon(); + test_waitsig(); + + fd = open(ro_f, O_CREAT | O_WRONLY, 0666); + if (fd != -1 || errno != EROFS) { + fail("%s is created", ro_f); + goto err; + } + + fd = open(rw_f, O_CREAT | O_WRONLY, 0666); + if (fd < 0) { + fail("Unable to create %s", rw_f); + goto err; + } + close(fd); + + fd = open(ro_f, O_RDONLY); + if (fd < 0) { + fail("Unable to create %s", rw_f); + goto err; + } + + pass(); + ret = 0; +err: + umount2(dirname, MNT_DETACH); + rmdir(dirname); + return ret; +}