[PATCH weston 1/8] Use anonymous shared memory for tempfiles
Greg V
greg at unrelenting.technology
Sun Dec 17 19:04:35 UTC 2017
SHM_ANON on FreeBSD, memfd on recent Linux.
- avoids usage of posix_fallocate on Copy-on-Write filesystems like ZFS
when XDG_RUNTIME_DIR is something like ~/.tmp instead of a tmpfs
(FreeBSD 12 does not even allow it on ZFS anymore)
- avoids touching the filesystem, which increases sandboxing potential
---
configure.ac | 2 +-
shared/os-compatibility.c | 22 ++++++++++++++++++----
2 files changed, 19 insertions(+), 5 deletions(-)
diff --git a/configure.ac b/configure.ac
index d1b5f471..253f7e73 100644
--- a/configure.ac
+++ b/configure.ac
@@ -103,7 +103,7 @@ AC_CHECK_DECL(TFD_CLOEXEC,[],
AC_CHECK_DECL(CLOCK_MONOTONIC,[],
[AC_MSG_ERROR("CLOCK_MONOTONIC is needed to compile weston")],
[[#include <time.h>]])
-AC_CHECK_HEADERS([execinfo.h])
+AC_CHECK_HEADERS([execinfo.h linux/memfd.h])
AC_CHECK_FUNCS([mkostemp strchrnul initgroups posix_fallocate])
diff --git a/shared/os-compatibility.c b/shared/os-compatibility.c
index e19fb61b..f55d3070 100644
--- a/shared/os-compatibility.c
+++ b/shared/os-compatibility.c
@@ -25,6 +25,13 @@
#include "config.h"
+#ifdef __FreeBSD__
+#include <sys/mman.h>
+#elif HAVE_LINUX_MEMFD_H
+#define _GNU_SOURCE
+#include <sys/syscall.h>
+#include <linux/memfd.h>
+#endif
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
@@ -107,12 +114,15 @@ os_epoll_create_cloexec(void)
return set_cloexec_or_close(fd);
}
+#ifndef __FreeBSD__
static int
create_tmpfile_cloexec(char *tmpname)
{
int fd;
-#ifdef HAVE_MKOSTEMP
+#ifdef HAVE_LINUX_MEMFD_H
+ fd = syscall(SYS_memfd_create, tmpname, MFD_CLOEXEC);
+#elif HAVE_MKOSTEMP
fd = mkostemp(tmpname, O_CLOEXEC);
if (fd >= 0)
unlink(tmpname);
@@ -126,6 +136,7 @@ create_tmpfile_cloexec(char *tmpname)
return fd;
}
+#endif
/*
* Create a new, unique, anonymous file of the given size, and
@@ -151,11 +162,13 @@ create_tmpfile_cloexec(char *tmpname)
int
os_create_anonymous_file(off_t size)
{
+ int fd, ret;
+#ifdef __FreeBSD__
+ fd = shm_open(SHM_ANON, O_CREAT | O_RDWR, 0600); // shm_open is always CLOEXEC
+#else
static const char template[] = "/weston-shared-XXXXXX";
const char *path;
char *name;
- int fd;
- int ret;
path = getenv("XDG_RUNTIME_DIR");
if (!path) {
@@ -173,11 +186,12 @@ os_create_anonymous_file(off_t size)
fd = create_tmpfile_cloexec(name);
free(name);
+#endif
if (fd < 0)
return -1;
-#ifdef HAVE_POSIX_FALLOCATE
+#if defined(HAVE_POSIX_FALLOCATE) && !defined(__FreeBSD__)
do {
ret = posix_fallocate(fd, 0, size);
} while (ret == EINTR);
--
2.15.1
More information about the wayland-devel
mailing list