Fix a kernel crash that occurs when the SMB protocol stack is used. The
authorMatthew Dillon <dillon@dragonflybsd.org>
Thu, 6 Jan 2005 22:31:16 +0000 (22:31 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Thu, 6 Jan 2005 22:31:16 +0000 (22:31 +0000)
SMB protocol stack is still hacked to create a kernel thread with a
process structure attached to it (when we really ought to be using a pure
kernel thread... this is the only subsystem that still doesn't).  However,
the SMB code was not properly cleaning the process structure up on exit
resulting in a corrupt process a list.  A 'ps' equivalent occuring after
this situation occurs can crash the kernel.

Reported-by: Rumko <rumcic@gmail.com>
sys/netproto/smb/smb_iod.c
sys/netproto/smb/smb_subr.c
sys/netproto/smb/smb_subr.h

index 2053e9b..8bc2218 100644 (file)
@@ -30,7 +30,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/netsmb/smb_iod.c,v 1.1.2.2 2002/04/23 03:45:01 bp Exp $
- * $DragonFly: src/sys/netproto/smb/smb_iod.c,v 1.10 2004/06/21 05:31:47 dillon Exp $
+ * $DragonFly: src/sys/netproto/smb/smb_iod.c,v 1.11 2005/01/06 22:31:16 dillon Exp $
  */
  
 #include <sys/param.h>
@@ -648,7 +648,7 @@ smb_iod_main(struct smbiod *iod)
 }
 
 #define        kthread_create_compat   kthread_create2
-
+#define kthread_exit_compat    kthread_exit2
 
 void
 smb_iod_thread(void *arg)
@@ -663,7 +663,7 @@ smb_iod_thread(void *arg)
                        break;
                tsleep(&iod->iod_flags, 0, "90idle", iod->iod_sleeptimo);
        }
-       kthread_exit();
+       kthread_exit_compat();
 }
 
 int
index d666ebe..b45c94f 100644 (file)
@@ -30,7 +30,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/netsmb/smb_subr.c,v 1.1.2.2 2001/09/03 08:55:11 bp Exp $
- * $DragonFly: src/sys/netproto/smb/smb_subr.c,v 1.12 2004/06/20 22:29:10 hmp Exp $
+ * $DragonFly: src/sys/netproto/smb/smb_subr.c,v 1.13 2005/01/06 22:31:16 dillon Exp $
  */
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -361,6 +361,9 @@ smb_put_asunistring(struct smb_rq *rqp, const char *src)
 /*
  * Create a kernel process/thread/whatever.  It shares it's address space
  * with proc0 - ie: kernel only.
+ *
+ * XXX only the SMB protocol uses this, we should convert this mess to a
+ * pure thread when possible.
  */
 int
 kthread_create2(void (*func)(void *), void *arg,
@@ -399,6 +402,12 @@ kthread_create2(void (*func)(void *), void *arg,
        return 0;
 }
 
+void
+kthread_exit2(void)
+{
+       exit1(0);
+}
+
 /*
  * smb_sleep() icky compat routine.  Leave the token held through the tsleep
  * to interlock against the sleep.  Remember that the token could be lost
index 2609e68..11654ec 100644 (file)
@@ -30,7 +30,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/netsmb/smb_subr.h,v 1.1.2.1 2001/05/22 08:32:34 bp Exp $
- * $DragonFly: src/sys/netproto/smb/smb_subr.h,v 1.9 2004/03/19 17:06:08 dillon Exp $
+ * $DragonFly: src/sys/netproto/smb/smb_subr.h,v 1.10 2005/01/06 22:31:16 dillon Exp $
  */
 #ifndef _NETSMB_SMB_SUBR_H_
 #define _NETSMB_SMB_SUBR_H_
@@ -172,6 +172,7 @@ int  smb_put_asunistring(struct smb_rq *rqp, const char *src);
  */
 int kthread_create2(void (*func)(void *), void *arg,
     struct proc **newpp, int flags, const char *fmt, ...);
+void kthread_exit2(void);
 int smb_sleep(void *chan, struct lwkt_tokref *ilock, int slpflags, const char *wmesg, int timo);