public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] loop.c: kernel_thread() retval check
@ 2006-08-19 23:46 Solar Designer
  2006-08-20  7:21 ` Willy Tarreau
  2006-08-20 18:15 ` Alan Cox
  0 siblings, 2 replies; 10+ messages in thread
From: Solar Designer @ 2006-08-19 23:46 UTC (permalink / raw)
  To: Willy Tarreau; +Cc: linux-kernel

[-- Attachment #1: Type: text/plain, Size: 774 bytes --]

Willy,

I propose the attached patch (extracted from 2.4.33-ow1) for inclusion
into 2.4.34-pre.  (Last time I checked, 2.6 needed an equivalent fix,
but I haven't produced one yet.)

Basically, the code in drivers/block/loop.c did not check the return
value from kernel_thread().  If kernel_thread() would fail, the code
would misbehave (IIRC, the invoking process would become unkillable).

An easy way to trigger the bug was to run losetup under strace (as
root), and this is also how I tested the error path added with this
patch.

This change has been a part of publicly released -ow patches for 8+
months.

There are more instances of kernel_thread() calls that do not check the
return value; some of the remaining ones might need to be fixed, too.

Thanks,

Alexander

[-- Attachment #2: linux-2.4.33-ow1-loop-kernel_thread-check.diff --]
[-- Type: text/plain, Size: 901 bytes --]

diff -urpPX nopatch linux-2.4.33/drivers/block/loop.c linux/drivers/block/loop.c
--- linux-2.4.33/drivers/block/loop.c	Fri Jun  3 04:26:42 2005
+++ linux/drivers/block/loop.c	Sat Aug 12 08:51:47 2006
@@ -693,12 +693,23 @@ static int loop_set_fd(struct loop_devic
 	set_blocksize(dev, bs);
 
 	lo->lo_bh = lo->lo_bhtail = NULL;
-	kernel_thread(loop_thread, lo, CLONE_FS | CLONE_FILES | CLONE_SIGHAND);
-	down(&lo->lo_sem);
+	error = kernel_thread(loop_thread, lo,
+	    CLONE_FS | CLONE_FILES | CLONE_SIGHAND);
+	if (error < 0)
+		goto out_clr;
+	down(&lo->lo_sem); /* wait for the thread to start */
 
 	fput(file);
 	return 0;
 
+ out_clr:
+	lo->lo_backing_file = NULL;
+	lo->lo_device = 0;
+	lo->lo_flags = 0;
+	loop_sizes[lo->lo_number] = 0;
+	inode->i_mapping->gfp_mask = lo->old_gfp_mask;
+	lo->lo_state = Lo_unbound;
+	fput(file); /* yes, have to do it twice */
  out_putf:
 	fput(file);
  out:

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2006-08-21  2:47 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-08-19 23:46 [PATCH] loop.c: kernel_thread() retval check Solar Designer
2006-08-20  7:21 ` Willy Tarreau
2006-08-20 14:32   ` Solar Designer
2006-08-20 18:15 ` Alan Cox
2006-08-20 22:34   ` Solar Designer
2006-08-20 23:11     ` Alan Cox
2006-08-20 22:58       ` Willy Tarreau
2006-08-21  1:59         ` Julio Auto
2006-08-21  2:32           ` Solar Designer
2006-08-21  2:47             ` Julio Auto

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox