Coda File System

[PATCH 1/3] Avoid crash when opening Coda device

From: Jan Harkes <jaharkes_at_cs.cmu.edu>
Date: Wed, 8 Nov 2006 16:38:49 -0500
When allocating coda_mntinfo, we need to initialize dev so that we
can actually find the allocated coda_mntinfo structure later on.
---
 coda_fbsd.c  |    5 +++--
 coda_psdev.c |   12 +++++++-----
 2 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/coda_fbsd.c b/coda_fbsd.c
index 96f6d53..a952dc9 100644
--- a/coda_fbsd.c
+++ b/coda_fbsd.c
@@ -124,6 +124,7 @@ static void coda_fbsd_clone(arg, cred, n
     dev_ref(*dev);
     mnt = malloc(sizeof(struct coda_mntinfo), M_CODA, M_WAITOK|M_ZERO);
     LIST_INSERT_HEAD(&coda_mnttbl, mnt, mi_list);
+    mnt->dev = *dev;
 }
 
 struct coda_mntinfo *
@@ -133,8 +134,8 @@ dev2coda_mntinfo(struct cdev *dev)
 
 	LIST_FOREACH(mnt, &coda_mnttbl, mi_list) {
 		if (mnt->dev == dev)
-			break;
+			return mnt;
 	}
 
-	return mnt;
+	return NULL;
 }
diff --git a/coda_psdev.c b/coda_psdev.c
index 5585c7d..530a2a1 100644
--- a/coda_psdev.c
+++ b/coda_psdev.c
@@ -129,6 +129,8 @@ vc_nb_open(dev, flag, mode, td)
 	coda_nc_init();
     
     mnt = dev2coda_mntinfo(dev);
+    KASSERT(mnt, ("Coda: tried to open uninitialized cfs device"));
+
     vcp = &mnt->mi_vcomm;
     if (VC_OPEN(vcp))
 	return(EBUSY);
@@ -154,15 +156,15 @@ vc_nb_close (dev, flag, mode, td)
     register struct vcomm *vcp;
     register struct vmsg *vmp, *nvmp = NULL;
     struct coda_mntinfo *mi;
-    int                 err;
+    int err;
 	
     ENTRY;
 
     mi = dev2coda_mntinfo(dev);
-    vcp = &(mi->mi_vcomm);
-    
-    if (!VC_OPEN(vcp))
-	panic("vcclose: not open");
+    KASSERT(mi, ("Coda: closing unknown cfs device"));
+
+    vcp = &mi->mi_vcomm;
+    KASSERT(VC_OPEN(vcp), ("Coda: closing unopened cfs device"));
     
     /* prevent future operations on this vfs from succeeding by auto-
      * unmounting any vfs mounted via this device. This frees user or
-- 
1.4.3.3.gc26a
Received on 2006-11-08 16:42:22