]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
memfd-util: Add memfd_new_and_seal()
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Wed, 8 Mar 2023 13:42:24 +0000 (14:42 +0100)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Thu, 9 Mar 2023 12:46:55 +0000 (13:46 +0100)
src/basic/memfd-util.c
src/basic/memfd-util.h
src/journal/fuzz-journald-native-fd.c
src/shared/data-fd-util.c

index fb86ac2b5bab6f154c4640471a0873c2c6a5c80a..96024bc485d7e45cfe7ec5b8076c22b5055cfc74 100644 (file)
@@ -133,3 +133,34 @@ int memfd_new_and_map(const char *name, size_t sz, void **p) {
 
         return TAKE_FD(fd);
 }
+
+int memfd_new_and_seal(const char *name, const void *data, size_t sz) {
+        _cleanup_close_ int fd = -EBADF;
+        ssize_t n;
+        off_t f;
+        int r;
+
+        assert(data || sz == 0);
+
+        fd = memfd_new(name);
+        if (fd < 0)
+                return fd;
+
+        if (sz > 0) {
+                n = write(fd, data, sz);
+                if (n < 0)
+                        return -errno;
+                if ((size_t) n != sz)
+                        return -EIO;
+
+                f = lseek(fd, 0, SEEK_SET);
+                if (f != 0)
+                        return -errno;
+        }
+
+        r = memfd_set_sealed(fd);
+        if (r < 0)
+                return r;
+
+        return TAKE_FD(fd);
+}
index 8596c1a3690428a56df90a33249a0b5d9af9e6f0..d6da268da05d90af6795903b7c4772c5a4dea6a4 100644 (file)
@@ -8,6 +8,7 @@
 
 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_map(int fd, uint64_t offset, size_t size, void **p);
 
index 9adbb8b0dc52988921637c14658bcc01bbffe74a..edbf834478dcd7eb92e5e1658dcdba53d5db6e21 100644 (file)
@@ -23,11 +23,8 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
 
         dummy_server_init(&s, NULL, 0);
 
-        sealed_fd = memfd_new(NULL);
+        sealed_fd = memfd_new_and_seal(NULL, data, size);
         assert_se(sealed_fd >= 0);
-        assert_se(write(sealed_fd, data, size) == (ssize_t) size);
-        assert_se(memfd_set_sealed(sealed_fd) >= 0);
-        assert_se(lseek(sealed_fd, 0, SEEK_SET) == 0);
         ucred = (struct ucred) {
                 .pid = getpid_cached(),
                 .uid = geteuid(),
index 895d8e8b334d0f70e460eb3d733e67381d58dc01..2baba0c5f1cb5eacc0ed10ba20de6562fc96ec1d 100644 (file)
@@ -31,7 +31,6 @@ int acquire_data_fd(const void *data, size_t size, unsigned flags) {
         _cleanup_close_ int fd = -EBADF;
         int isz = 0, r;
         ssize_t n;
-        off_t f;
 
         assert(data || size == 0);
 
@@ -59,23 +58,13 @@ int acquire_data_fd(const void *data, size_t size, unsigned flags) {
                 return RET_NERRNO(open("/dev/null", O_RDONLY|O_CLOEXEC|O_NOCTTY));
 
         if ((flags & ACQUIRE_NO_MEMFD) == 0) {
-                fd = memfd_new("data-fd");
-                if (fd < 0)
-                        goto try_pipe;
-
-                n = write(fd, data, size);
-                if (n < 0)
-                        return -errno;
-                if ((size_t) n != size)
-                        return -EIO;
+                fd = memfd_new_and_seal("data-fd", data, size);
+                if (fd < 0) {
+                        if (ERRNO_IS_NOT_SUPPORTED(fd))
+                                goto try_pipe;
 
-                f = lseek(fd, 0, SEEK_SET);
-                if (f != 0)
-                        return -errno;
-
-                r = memfd_set_sealed(fd);
-                if (r < 0)
-                        return r;
+                        return fd;
+                }
 
                 return TAKE_FD(fd);
         }