memfd-util: Add memfd_new_and_seal()
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user