memfd-util: Add memfd_new_and_seal()

This commit is contained in:
Daan De Meyer
2023-03-09 13:46:55 +01:00
parent 81707069fc
commit 44777d7ad6
4 changed files with 39 additions and 21 deletions
+31
View 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);
}
+1
View 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);
+1 -4
View 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(),
+6 -17
View 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;
fd = memfd_new_and_seal("data-fd", data, size);
if (fd < 0) {
if (ERRNO_IS_NOT_SUPPORTED(fd))
goto try_pipe;
n = write(fd, data, size);
if (n < 0)
return -errno;
if ((size_t) n != size)
return -EIO;
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);
}