]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
basic/memfd: add fcntl() wrappers
authorDavid Rheinsberg <david@readahead.eu>
Mon, 17 Jul 2023 10:16:01 +0000 (12:16 +0200)
committerDavid Rheinsberg <david@readahead.eu>
Tue, 1 Aug 2023 08:14:49 +0000 (10:14 +0200)
Add wrappers around GET/ADD_SEALS to allow future use outside of the
current `memfd_get/set_sealed()` helpers.

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

index e21514fa9ea91497d09c3162c91c4854ffaafdce..a80d586ffa6586bc86497944dded9b228385b7a3 100644 (file)
@@ -68,6 +68,26 @@ int memfd_new(const char *name) {
         return memfd_create_wrapper(name, MFD_ALLOW_SEALING | MFD_CLOEXEC | MFD_NOEXEC_SEAL);
 }
 
+int memfd_add_seals(int fd, unsigned int seals) {
+        assert(fd >= 0);
+
+        return RET_NERRNO(fcntl(fd, F_ADD_SEALS, seals));
+}
+
+int memfd_get_seals(int fd, unsigned int *ret_seals) {
+        int r;
+
+        assert(fd >= 0);
+
+        r = RET_NERRNO(fcntl(fd, F_GET_SEALS));
+        if (r < 0)
+                return r;
+
+        if (ret_seals)
+                *ret_seals = r;
+        return 0;
+}
+
 int memfd_map(int fd, uint64_t offset, size_t size, void **p) {
         void *q;
         int sealed;
@@ -92,22 +112,19 @@ int memfd_map(int fd, uint64_t offset, size_t size, void **p) {
 }
 
 int memfd_set_sealed(int fd) {
-        assert(fd >= 0);
-
-        return RET_NERRNO(fcntl(fd, F_ADD_SEALS, F_SEAL_SEAL | F_SEAL_SHRINK | F_SEAL_GROW | F_SEAL_WRITE));
+        return memfd_add_seals(fd, F_SEAL_SEAL | F_SEAL_SHRINK | F_SEAL_GROW | F_SEAL_WRITE);
 }
 
 int memfd_get_sealed(int fd) {
+        unsigned int seals;
         int r;
 
-        assert(fd >= 0);
-
-        r = fcntl(fd, F_GET_SEALS);
+        r = memfd_get_seals(fd, &seals);
         if (r < 0)
-                return -errno;
+                return r;
 
         /* We ignore F_SEAL_EXEC here to support older kernels. */
-        return FLAGS_SET(r, F_SEAL_SHRINK | F_SEAL_GROW | F_SEAL_WRITE);
+        return FLAGS_SET(seals, F_SEAL_SHRINK | F_SEAL_GROW | F_SEAL_WRITE);
 }
 
 int memfd_get_size(int fd, uint64_t *sz) {
index 0fe8e3a3c4d4b82fe157bef2bae68690c2df2f5e..9b2103e0ced4a84761b840e1d361499ad478b6f5 100644 (file)
@@ -12,6 +12,8 @@ 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);
 
+int memfd_add_seals(int fd, unsigned int seals);
+int memfd_get_seals(int fd, unsigned int *ret_seals);
 int memfd_map(int fd, uint64_t offset, size_t size, void **p);
 
 int memfd_set_sealed(int fd);