From 4c05e2b4a063b15971ed967b09f648489544618c Mon Sep 17 00:00:00 2001 From: Dhanuka Warusadura Date: Wed, 17 May 2023 16:27:19 +0530 Subject: [PATCH] memfd_secret: test case for memfd_secret Adds a test case to test checkpoint and restore of a memfd_secret fd containing process. Signed-off-by: Dhanuka Warusadura --- test/zdtm/static/Makefile | 1 + test/zdtm/static/memfd-secret00.c | 76 +++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 test/zdtm/static/memfd-secret00.c diff --git a/test/zdtm/static/Makefile b/test/zdtm/static/Makefile index 30429e425a..c259637e1c 100644 --- a/test/zdtm/static/Makefile +++ b/test/zdtm/static/Makefile @@ -257,6 +257,7 @@ TST_NOFILE := \ memfd02 \ memfd02-hugetlb \ memfd03 \ + memfd-secret00 \ shmemfd \ shmemfd-priv \ time \ diff --git a/test/zdtm/static/memfd-secret00.c b/test/zdtm/static/memfd-secret00.c new file mode 100644 index 0000000000..74be87b1af --- /dev/null +++ b/test/zdtm/static/memfd-secret00.c @@ -0,0 +1,76 @@ +#include +#include +#include +#include +#include + +#include "zdtmtst.h" + +#define SECRET "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +#define SIZE 26 + +const char *test_doc = "memfd_secret file descriptor"; +const char *test_author = "Dhanuka Warusadura "; + +static int _memfd_secret(unsigned int flags) +{ + return syscall(SYS_memfd_secret, flags); +} + +static void *secret_init(size_t size) +{ + int fd; + void *secretmem = NULL; + + fd = _memfd_secret(0); + if (fd < 0) + return secretmem; + + if (ftruncate(fd, size) < 0) { + close(fd); + return secretmem; + } + + secretmem = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + if (secretmem == MAP_FAILED) { + close(fd); + return secretmem; + } + + return secretmem; +} + +static void secret_fini(void *mem, size_t size) +{ + munmap(mem, size); +} + +int main(int argc, char *argv[]) +{ + char *secretmem; + + test_init(argc, argv); + + secretmem = secret_init(SIZE); + if (!secretmem) { + fail("memfd_secret: not supported operation"); + return 1; + } + + for (int i = 0; i < SIZE; i++) + secretmem[i] = 'A' + i; + + test_daemon(); + test_waitsig(); + + if (strncmp(secretmem, SECRET, SIZE)) { + fail("secretmem content mismatch"); + return 1; + } + + secret_fini(secretmem, SIZE); + + pass(); + + return 0; +}