]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
memfd-util: add wrapper for memfd_create
authorThomas Weißschuh <thomas@t-8ch.de>
Tue, 14 Mar 2023 03:42:05 +0000 (03:42 +0000)
committerThomas Weißschuh <thomas@t-8ch.de>
Wed, 15 Mar 2023 01:18:59 +0000 (01:18 +0000)
The wrapper removes the flags MFD_EXEC and MFD_NOEXEC_SEAL when running
on kernels not understanding those flags.

src/basic/memfd-util.c
src/basic/memfd-util.h

index 96024bc485d7e45cfe7ec5b8076c22b5055cfc74..99df236e7db0212af4f4c2bb1d1e64baeabc3752 100644 (file)
 #include "string-util.h"
 #include "utf8.h"
 
+int memfd_create_wrapper(const char *name, unsigned mode) {
+        unsigned mode_compat;
+        int mfd;
+
+        mfd = RET_NERRNO(memfd_create(name, mode));
+        if (mfd != -EINVAL)
+                return mfd;
+
+        mode_compat = mode & ~(MFD_EXEC | MFD_NOEXEC_SEAL);
+
+        if (mode == mode_compat)
+                return mfd;
+
+        return RET_NERRNO(memfd_create(name, mode_compat));
+}
+
 int memfd_new(const char *name) {
         _cleanup_free_ char *g = NULL;
 
index d6da268da05d90af6795903b7c4772c5a4dea6a4..0fe8e3a3c4d4b82fe157bef2bae68690c2df2f5e 100644 (file)
@@ -6,6 +6,8 @@
 #include <stdint.h>
 #include <sys/types.h>
 
+int memfd_create_wrapper(const char *name, unsigned mode);
+
 int memfd_new(const char *name);
 int memfd_new_and_map(const char *name, size_t sz, void **p);
 int memfd_new_and_seal(const char *name, const void *data, size_t sz);