Commit b14fad55 authored by Prithvi Tambewagh's avatar Prithvi Tambewagh Committed by Jens Axboe
Browse files

io_uring: fix filename leak in __io_openat_prep()



 __io_openat_prep() allocates a struct filename using getname(). However,
for the condition of the file being installed in the fixed file table as
well as having O_CLOEXEC flag set, the function returns early. At that
point, the request doesn't have REQ_F_NEED_CLEANUP flag set. Due to this,
the memory for the newly allocated struct filename is not cleaned up,
causing a memory leak.

Fix this by setting the REQ_F_NEED_CLEANUP for the request just after the
successful getname() call, so that when the request is torn down, the
filename will be cleaned up, along with other resources needing cleanup.

Reported-by: default avatar <syzbot+00e61c43eb5e4740438f@syzkaller.appspotmail.com>
Closes: https://syzkaller.appspot.com/bug?extid=00e61c43eb5e4740438f


Tested-by: default avatar <syzbot+00e61c43eb5e4740438f@syzkaller.appspotmail.com>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarPrithvi Tambewagh <activprithvi@gmail.com>
Fixes: b9445598 ("io_uring: openat directly into fixed fd table")
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 114ea9bb
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -73,13 +73,13 @@ static int __io_openat_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe
		open->filename = NULL;
		return ret;
	}
	req->flags |= REQ_F_NEED_CLEANUP;

	open->file_slot = READ_ONCE(sqe->file_index);
	if (open->file_slot && (open->how.flags & O_CLOEXEC))
		return -EINVAL;

	open->nofile = rlimit(RLIMIT_NOFILE);
	req->flags |= REQ_F_NEED_CLEANUP;
	if (io_openat_force_async(open))
		req->flags |= REQ_F_FORCE_ASYNC;
	return 0;