Thread (26 messages) 26 messages, 4 authors, 2021-07-24

Re: [PATCH 3/3] io_uring: refactor io_sq_offload_create()

From: Jens Axboe <axboe@kernel.dk>
Date: 2021-07-22 23:06:29
Also in: linux-fsdevel

On 7/22/21 3:59 PM, Al Viro wrote:
On Tue, Apr 20, 2021 at 12:03:33PM +0100, Pavel Begunkov wrote:
quoted
Just a bit of code tossing in io_sq_offload_create(), so it looks a bit
better. No functional changes.
Does a use-after-free count as a functional change?
quoted
 		f = fdget(p->wq_fd);
Descriptor table is shared with another thread, grabbed a reference to file.
Refcount is 2 (1 from descriptor table, 1 held by us)
quoted
 		if (!f.file)
 			return -ENXIO;
Nope, not NULL.
quoted
-		if (f.file->f_op != &io_uring_fops) {
-			fdput(f);
-			return -EINVAL;
-		}
 		fdput(f);
Decrement refcount, get preempted away.  f.file->f_count is 1 now.

Another thread: close() on the same descriptor.  Final reference to
struct file (from descriptor table) is gone, file closed, memory freed.

Regain CPU...
quoted
+		if (f.file->f_op != &io_uring_fops)
+			return -EINVAL;
... and dereference an already freed structure.

What scares me here is that you are playing with bloody fundamental
objects, without understanding even the basics regarding their
handling ;-/
Let's calm down here, no need to resort to hyperbole. It looks like an
honest mistake to me, and I should have caught that in review. You don't
even need to understand file structure life times to realize that:

	put(shared_struct);
	if (shared_struct->foo)
		...

is a bad idea. Which Pavel obviously does.

But yes, that is not great and obviously a bug, and we'll of course get
it fixed up asap.

-- 
Jens Axboe
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help