]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/mini-os.git/commitdiff
mini-os: Fix crash on frontend shutdown failures
authorKeir Fraser <keir.fraser@citrix.com>
Wed, 7 Apr 2010 07:16:15 +0000 (08:16 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Wed, 7 Apr 2010 07:16:15 +0000 (08:16 +0100)
Do not free frontend resources if some error happened, since the
backend may not have finished properly restarting in such case.

Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
blkfront.c
fbfront.c
netfront.c
pcifront.c

index f47aa69f23cf731822975f12e753961d62601589..d59140fcb8dac96c0e5ee1ee58e00afca537ac10 100644 (file)
@@ -313,7 +313,8 @@ close:
     snprintf(path, sizeof(path), "%s/event-channel", nodename);
     xenbus_rm(XBT_NIL, path);
 
-    free_blkfront(dev);
+    if (!err)
+        free_blkfront(dev);
 }
 
 static void blkfront_wait_slot(struct blkfront_dev *dev)
index 6d2268e27e0e3de7c69f1f10e4ca1822d80ae8f8..ef024cbcd0c0809108bd9a2b9275610b8e8b9ff5 100644 (file)
--- a/fbfront.c
+++ b/fbfront.c
@@ -288,7 +288,8 @@ close_kbdfront:
     snprintf(path, sizeof(path), "%s/request-abs-pointer", nodename);
     xenbus_rm(XBT_NIL, path);
 
-    free_kbdfront(dev);
+    if (!err)
+        free_kbdfront(dev);
 }
 
 #ifdef HAVE_LIBC
@@ -681,7 +682,8 @@ close_fbfront:
     snprintf(path, sizeof(path), "%s/feature-update", nodename);
     xenbus_rm(XBT_NIL, path);
 
-    free_fbfront(dev);
+    if (!err)
+        free_fbfront(dev);
 }
 
 #ifdef HAVE_LIBC
index 491876fd9a7f2feaf8992e27d7a46f28ec1139eb..bc70b98b4aaf66bca0451bd9a223ea457473dc8b 100644 (file)
@@ -574,7 +574,8 @@ close:
     snprintf(path, sizeof(path), "%s/request-rx-copy", nodename);
     xenbus_rm(XBT_NIL, path);
 
-    free_netfront(dev);
+    if (!err)
+        free_netfront(dev);
 }
 
 
index 638fdb3966381a0e11dfa837d9cf3d78cffc7659..dc6c461de8126729bf6d8e23590d96e05467428f 100644 (file)
@@ -378,7 +378,8 @@ close_pcifront:
     snprintf(path, sizeof(path), "%s/event-channel", nodename);
     xenbus_rm(XBT_NIL, path);
 
-    free_pcifront(dev);
+    if (!err)
+        free_pcifront(dev);
 }
 
 int pcifront_physical_to_virtual (struct pcifront_dev *dev,