summaryrefslogtreecommitdiff
path: root/src/tests/anonymous-file.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tests/anonymous-file.c')
-rw-r--r--src/tests/anonymous-file.c282
1 files changed, 0 insertions, 282 deletions
diff --git a/src/tests/anonymous-file.c b/src/tests/anonymous-file.c
deleted file mode 100644
index 29f5ceac8..000000000
--- a/src/tests/anonymous-file.c
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * Copyright (C) 2020 Jonas Dreßler.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "config.h"
-
-#include <glib.h>
-#include <sys/resource.h>
-#include <sys/mman.h>
-#include <fcntl.h>
-#include <unistd.h>
-
-#include <core/meta-anonymous-file.h>
-
-#if defined(HAVE_MEMFD_CREATE)
-#define READONLY_SEALS (F_SEAL_SHRINK | F_SEAL_GROW | F_SEAL_WRITE)
-#endif
-
-static const char *teststring = "test string 1234567890";
-
-static gboolean
-test_read_fd_mmap (int fd,
- const char *expected_string)
-{
- void *mem;
- int string_size;
-
- string_size = strlen (expected_string) + 1;
-
- mem = mmap (NULL, string_size, PROT_READ, MAP_PRIVATE, fd, 0);
- g_assert (mem != MAP_FAILED);
-
- if (strcmp (expected_string, mem) != 0)
- {
- munmap (mem, string_size);
- return FALSE;
- }
-
- munmap (mem, string_size);
- return TRUE;
-}
-
-static gboolean
-test_write_fd (int fd,
- const char *string)
-{
- int written_size, string_size;
-
- string_size = strlen (string) + 1;
- written_size = write (fd, string, string_size);
- if (written_size != string_size)
- return FALSE;
-
- return TRUE;
-}
-
-#if defined(HAVE_MEMFD_CREATE)
-static gboolean
-test_readonly_seals (int fd)
-{
- unsigned int seals;
-
- seals = fcntl (fd, F_GET_SEALS);
- if (seals == -1)
- return FALSE;
-
- if (seals != READONLY_SEALS)
- return FALSE;
-
- return TRUE;
-}
-#endif
-
-static gboolean
-test_write_read (int fd)
-{
- g_autofree char *new_string = g_uuid_string_random ();
-
- if (!test_write_fd (fd, new_string))
- return FALSE;
-
- if (!test_read_fd_mmap (fd, new_string))
- return FALSE;
-
- return TRUE;
-}
-
-#if defined(HAVE_MEMFD_CREATE)
-static gboolean
-test_open_write_read (const char *path)
-{
- int fd;
-
- fd = open (path, O_RDWR);
- g_assert (fd != -1);
-
- if (!test_write_read (fd))
- {
- close (fd);
- return FALSE;
- }
-
- close (fd);
- return TRUE;
-}
-#endif
-
-int
-main (int argc,
- char **argv)
-{
- MetaAnonymousFile *file;
- int fd = -1, other_fd = -1;
- g_autofree char *fd_path = NULL;
-
- file = meta_anonymous_file_new (strlen (teststring) + 1,
- (const uint8_t *) teststring);
- if (!file)
- {
- g_critical ("%s: Creating file failed", __func__);
- return EXIT_FAILURE;
- }
-
-#if defined(HAVE_MEMFD_CREATE)
- fd = meta_anonymous_file_open_fd (file, META_ANONYMOUS_FILE_MAPMODE_PRIVATE);
- g_assert (fd != -1);
- other_fd = meta_anonymous_file_open_fd (file, META_ANONYMOUS_FILE_MAPMODE_PRIVATE);
- g_assert (other_fd != -1);
-
- /* When MAPMODE_PRIVATE was used, meta_anonymous_file_open_fd() should always
- * return the same fd. */
- if (other_fd != fd)
- goto fail;
-
- /* If memfd_create was used and we request a MAPMODE_PRIVATE file, all the
- * readonly seals should be set. */
- if (!test_readonly_seals (fd))
- goto fail;
-
- if (!test_read_fd_mmap (fd, teststring))
- goto fail;
-
- /* Writing and reading the written data should fail */
- if (test_write_read (fd))
- goto fail;
-
- /* Instead we should still be reading the teststring */
- if (!test_read_fd_mmap (fd, teststring))
- goto fail;
-
- /* Opening the fd manually in RW mode and writing to it should fail */
- fd_path = g_strdup_printf ("/proc/%d/fd/%d", getpid (), fd);
- if (test_open_write_read (fd_path))
- goto fail;
-
- /* Instead we should still be reading the teststring */
- if (!test_read_fd_mmap (fd, teststring))
- goto fail;
-
- /* Just to be sure test the other fd, too */
- if (!test_read_fd_mmap (other_fd, teststring))
- goto fail;
-
- meta_anonymous_file_close_fd (fd);
- meta_anonymous_file_close_fd (fd);
-
-
- fd = meta_anonymous_file_open_fd (file, META_ANONYMOUS_FILE_MAPMODE_SHARED);
- g_assert (fd != -1);
- other_fd = meta_anonymous_file_open_fd (file, META_ANONYMOUS_FILE_MAPMODE_SHARED);
- g_assert (other_fd != -1);
-
- /* The MAPMODE_SHARED fd should not have readonly seals applied */
- if (test_readonly_seals (fd))
- goto fail;
-
- if (!test_read_fd_mmap (fd, teststring))
- goto fail;
-
- if (!test_read_fd_mmap (other_fd, teststring))
- goto fail;
-
- /* Writing and reading the written data should succeed */
- if (!test_write_read (fd))
- goto fail;
-
- /* The other fd should still read the teststring though */
- if (!test_read_fd_mmap (other_fd, teststring))
- goto fail;
-
- meta_anonymous_file_close_fd (fd);
- meta_anonymous_file_close_fd (other_fd);
-
-
- /* Test an artificial out-of-space situation by setting the maximum file
- * size this process may create to 2 bytes, if memfd_create with
- * MAPMODE_PRIVATE is used, everything should still work (the existing FD
- * should be used). */
-
- if (!getenv ("CI_JOB_ID"))
- {
- struct rlimit rlimit = {
- .rlim_cur = 2,
- .rlim_max = 2,
- };
-
- if (setrlimit (RLIMIT_FSIZE, &rlimit) == -1)
- goto fail;
-
- fd = meta_anonymous_file_open_fd (file, META_ANONYMOUS_FILE_MAPMODE_PRIVATE);
- g_assert (fd != -1);
-
- if (!test_read_fd_mmap (fd, teststring))
- goto fail;
-
- meta_anonymous_file_close_fd (fd);
- }
-#else
- fd = meta_anonymous_file_open_fd (file, META_ANONYMOUS_FILE_MAPMODE_PRIVATE);
- g_assert (fd != -1);
- other_fd = meta_anonymous_file_open_fd (file, META_ANONYMOUS_FILE_MAPMODE_PRIVATE);
- g_assert (other_fd != -1);
-
- /* Writing and reading the written data should succeed */
- if (!test_write_read (fd))
- goto fail;
-
- /* The other fd should still read the teststring though */
- if (!test_read_fd_mmap (other_fd, teststring))
- goto fail;
-
- meta_anonymous_file_close_fd (fd);
- meta_anonymous_file_close_fd (other_fd);
-
-
- fd = meta_anonymous_file_open_fd (file, META_ANONYMOUS_FILE_MAPMODE_SHARED);
- g_assert (fd != -1);
- other_fd = meta_anonymous_file_open_fd (file, META_ANONYMOUS_FILE_MAPMODE_SHARED);
- g_assert (other_fd != -1);
-
- if (!test_read_fd_mmap (fd, teststring))
- goto fail;
-
- if (!test_read_fd_mmap (other_fd, teststring))
- goto fail;
-
- /* Writing and reading the written data should succeed */
- if (!test_write_read (fd))
- goto fail;
-
- /* The other fd should still read the teststring though */
- if (!test_read_fd_mmap (other_fd, teststring))
- goto fail;
-
- meta_anonymous_file_close_fd (fd);
- meta_anonymous_file_close_fd (other_fd);
-#endif
-
- meta_anonymous_file_free (file);
- return EXIT_SUCCESS;
-
- fail:
- if (fd > 0)
- meta_anonymous_file_close_fd (fd);
- if (other_fd > 0)
- meta_anonymous_file_close_fd (other_fd);
- meta_anonymous_file_free (file);
- return EXIT_FAILURE;
-}