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);
+}
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);
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(),
_cleanup_close_ int fd = -EBADF;
int isz = 0, r;
ssize_t n;
- off_t f;
assert(data || size == 0);
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);
}