[bus] Make callers of bus__add_child responsible...
authorShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Thu, 9 Dec 2010 21:58:40 +0000 (16:58 -0500)
committerShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Thu, 9 Dec 2010 21:58:40 +0000 (16:58 -0500)
...for freeing their device if bus__add_child() fails.
This is better than bus__add_child() freeing it, for the sake
of consistency in the code.  I accidentally re-freed not
once, but twice, while trying some things out.

src/winvblock/bus/bus.c
src/winvblock/filedisk/filedisk.c
src/winvblock/filedisk/grub4dos.c
src/winvblock/ramdisk/grub4dos.c
src/winvblock/ramdisk/memdisk.c

index c4f2dfe..cee342f 100644 (file)
@@ -473,8 +473,6 @@ static PDEVICE_OBJECT STDCALL bus__create_pdo_(IN device__type_ptr dev) {
     IoDeleteDevice(pdo);
     err_pdo:
 
-    /* Destroy the caller's device! */
-    device__free(dev);
     return NULL;
   }
 
index 064e716..609937b 100644 (file)
@@ -221,12 +221,15 @@ NTSTATUS STDCALL filedisk__attach(
     while ( *path_iterator )
       filedisk_ptr->hash += *path_iterator++;
   }
-  /*
-   * FIXME: Check for error below!
-   */
-  bus__add_child(driver__bus(), filedisk_ptr->disk->device);
+  /* Add the filedisk to the bus. */
+  if (!bus__add_child(driver__bus(), filedisk_ptr->disk->device)) {
+      status = STATUS_UNSUCCESSFUL;
+      goto err_add_child;
+    }
   return STATUS_SUCCESS;
 
+  err_add_child:
+
 err_query_info:
 
   ZwClose ( file );
index 137994d..8a9cc35 100644 (file)
@@ -493,7 +493,9 @@ filedisk_grub4dos__find (
            Grub4DosDriveMapSlotPtr[i].SourceDrive;
          filedisk_ptr->disk->BootDrive = TRUE;
          FoundGrub4DosMapping = TRUE;
-         bus__add_child(driver__bus(), filedisk_ptr->disk->device);
+         /* Add the filedisk to the bus. */
+         if (!bus__add_child(driver__bus(), filedisk_ptr->disk->device))
+      device__free(filedisk_ptr->disk->device);
        }
       InterruptVector = &SafeMbrHookPtr->PrevHook;
     }
index a2b567b..6ace133 100644 (file)
@@ -146,7 +146,9 @@ ramdisk_grub4dos__find (
                                               ramdisk_ptr->disk->Sectors );
          ramdisk_ptr->disk->BootDrive = TRUE;
          FoundGrub4DosMapping = TRUE;
-         bus__add_child(driver__bus(), ramdisk_ptr->disk->device);
+         /* Add the ramdisk to the bus. */
+         if (!bus__add_child(driver__bus(), ramdisk_ptr->disk->device))
+      device__free(ramdisk_ptr->disk->device);
        }
       InterruptVector = &SafeMbrHookPtr->PrevHook;
     }
index 48a40a6..21d8578 100644 (file)
@@ -110,7 +110,11 @@ check_mbft (
   ramdisk_ptr->disk->Heads = mBFT->mdi.heads;
   ramdisk_ptr->disk->Sectors = mBFT->mdi.sectors;
   ramdisk_ptr->disk->BootDrive = TRUE;
-  bus__add_child(driver__bus(), ramdisk_ptr->disk->device);
+  /* Add the ramdisk to the bus. */
+  if (!bus__add_child(driver__bus(), ramdisk_ptr->disk->device)) {
+      device__free(ramdisk_ptr->disk->device);
+      return FALSE;
+    }
   AssociatedHook->Flags = 1;
   return TRUE;
 }