diff options
author | Pavel Tikhomirov <ptikhomirov@virtuozzo.com> | 2018-12-13 12:02:55 +0300 |
---|---|---|
committer | Andrei Vagin <avagin@gmail.com> | 2019-04-21 06:25:26 +0300 |
commit | 0aef3d975e7eccea70f401716db74a6762f95b2e (patch) | |
tree | 9ea23dc812c3e71701e74869206cc2aa08fa5cb7 /test | |
parent | 304deda565f0042865dc0eb9e17ae0af3e1b429a (diff) |
zdtm: test dumping file on overmounted mount fails
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
Signed-off-by: Andrei Vagin <avagin@gmail.com>
Diffstat (limited to 'test')
-rw-r--r-- | test/zdtm/static/Makefile | 1 | ||||
-rw-r--r-- | test/zdtm/static/overmounted_file.c | 109 | ||||
-rw-r--r-- | test/zdtm/static/overmounted_file.desc | 1 |
3 files changed, 111 insertions, 0 deletions
diff --git a/test/zdtm/static/Makefile b/test/zdtm/static/Makefile index cb6c7441d..a31c202d5 100644 --- a/test/zdtm/static/Makefile +++ b/test/zdtm/static/Makefile @@ -344,6 +344,7 @@ TST_DIR = \ non_uniform_share_propagation \ private_bind_propagation \ ghost_on_rofs \ + overmounted_file \ TST_DIR_FILE = \ chroot \ diff --git a/test/zdtm/static/overmounted_file.c b/test/zdtm/static/overmounted_file.c new file mode 100644 index 000000000..ee1d1c58f --- /dev/null +++ b/test/zdtm/static/overmounted_file.c @@ -0,0 +1,109 @@ +#include <sys/mount.h> +#include <sys/stat.h> +#include <limits.h> +#include <fcntl.h> +#include <unistd.h> + +#include "zdtmtst.h" + +const char *test_doc = "Check open file on overmounted mounts doesn't dump"; +const char *test_author = "Pavel Tikhomirov <ptikhomirov@virtuozzo.com>"; + +#define DATA "Data" + +char *dirname; +TEST_OPTION(dirname, string, "directory name", 1); + +int main(int argc, char **argv) +{ + char overmounted[PATH_MAX]; + char buf[sizeof(DATA)]; + char file[PATH_MAX]; + int fd; + + test_init(argc, argv); + + if (mkdir(dirname, 0700)) { + pr_perror("mkdir"); + return 1; + } + + if (mount("zdtm_fs", dirname, "tmpfs", 0, NULL)) { + pr_perror("mount"); + return 1; + } + + if (mount(NULL, dirname, NULL, MS_PRIVATE, NULL)) { + pr_perror("mount"); + return 1; + } + + ssprintf(overmounted, "%s/overmounted", dirname); + if (mkdir(overmounted, 0700)) { + pr_perror("mkdir"); + return 1; + } + + if (mount("overmounted", overmounted, "tmpfs", 0, NULL)) { + pr_perror("mount"); + return 1; + } + + ssprintf(file, "%s/file", overmounted); + fd = open(file, O_CREAT|O_WRONLY, 0600); + if (fd < 0) { + pr_perror("open"); + return 1; + } + + if (write(fd, DATA, sizeof(DATA)) != sizeof(DATA)) { + pr_perror("write"); + return 1; + } + close(fd); + + fd = open(file, O_RDONLY); + if (fd < 0) { + pr_perror("open"); + return 1; + } + + if (mount(overmounted, overmounted, NULL, MS_BIND, NULL)) { + pr_perror("mount"); + return 1; + } + + test_daemon(); + test_waitsig(); + + if (read(fd, buf, sizeof(DATA)) != sizeof(DATA)) { + fail("Can't read from file"); + return 1; + } + + if (strcmp(buf, DATA)) { + fail("Wrong data in a file"); + return 1; + } + + close(fd); + + if (umount(overmounted)) { + pr_perror("umount"); + return 1; + } + + if (umount(overmounted)) { + pr_perror("umount"); + return 1; + } + + if (umount(dirname)) { + pr_perror("umount"); + return 1; + } + + pass(); + + return 0; +} diff --git a/test/zdtm/static/overmounted_file.desc b/test/zdtm/static/overmounted_file.desc new file mode 100644 index 000000000..0d8b7f2b4 --- /dev/null +++ b/test/zdtm/static/overmounted_file.desc @@ -0,0 +1 @@ +{'flavor': 'ns uns', 'flags': 'suid crfail'} |