diff options
author | Stefano Brivio <sbrivio@redhat.com> | 2023-06-02 16:48:29 +0200 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2023-06-02 16:49:48 +0200 |
commit | 6455b9dff0554adc11e8dbe8027d134c8584bc5d (patch) | |
tree | 2c403f9e2cdb7e864ecea449f6fb7375ed5416e5 /operations.c | |
parent | fb2a89cbfc5049d360bb734b4896946e9963e39a (diff) | |
download | seitan-6455b9dff0554adc11e8dbe8027d134c8584bc5d.tar seitan-6455b9dff0554adc11e8dbe8027d134c8584bc5d.tar.gz seitan-6455b9dff0554adc11e8dbe8027d134c8584bc5d.tar.bz2 seitan-6455b9dff0554adc11e8dbe8027d134c8584bc5d.tar.lz seitan-6455b9dff0554adc11e8dbe8027d134c8584bc5d.tar.xz seitan-6455b9dff0554adc11e8dbe8027d134c8584bc5d.tar.zst seitan-6455b9dff0554adc11e8dbe8027d134c8584bc5d.zip |
cooker, seitan: OP_FD
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'operations.c')
-rw-r--r-- | operations.c | 41 |
1 files changed, 19 insertions, 22 deletions
diff --git a/operations.c b/operations.c index 304b39b..e210e2f 100644 --- a/operations.c +++ b/operations.c @@ -309,42 +309,39 @@ int op_continue(const struct seccomp_notif *req, int notifier, struct gluten *g, return 0; } -static int do_inject(const struct seccomp_notif *req, int notifier, - struct gluten *g, struct op_inject *op, bool atomic) +static int op_fd(const struct seccomp_notif *req, int notifier, + struct gluten *g, struct op_fd *op) { + const struct fd_desc *desc = gluten_ptr(&req->data, g, op->desc); struct seccomp_notif_addfd resp; + void *fd; + + if (!desc) + return -1; resp.flags = SECCOMP_ADDFD_FLAG_SETFD; - resp.newfd_flags = 0; + resp.flags |= desc->do_return ? SECCOMP_ADDFD_FLAG_SEND : 0; + resp.newfd_flags = desc->cloexec ? O_CLOEXEC : 0; resp.id = req->id; - if (gluten_read(&req->data, g, &resp.newfd, op->new_fd, - sizeof(resp.newfd)) == -1) - return -1; - if (gluten_read(&req->data, g, &resp.srcfd, op->old_fd, - sizeof(resp.srcfd)) == -1) + if (!(fd = gluten_ptr(&req->data, g, desc->srcfd))) return -1; + resp.srcfd = *(uint32_t *)fd; + + if (desc->setfd) { + if (!(fd = gluten_ptr(&req->data, g, desc->newfd))) + return -1; + resp.newfd = *(uint32_t *)fd; + } else { + resp.newfd = 0; + } - if (atomic) - resp.flags |= SECCOMP_ADDFD_FLAG_SEND; if (send_inject_target(&resp, notifier) == -1) return -1; return 0; } -int op_inject(const struct seccomp_notif *req, int notifier, struct gluten *g, - struct op_inject *op) -{ - return do_inject(req, notifier, g, op, false); -} - -int op_inject_a(const struct seccomp_notif *req, int notifier, struct gluten *g, - struct op_inject *op) -{ - return do_inject(req, notifier, g, op, true); -} - int op_cmp(const struct seccomp_notif *req, int notifier, struct gluten *g, struct op_cmp *op) { |