...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.
IoDeleteDevice(pdo);
err_pdo:
- /* Destroy the caller's device! */
- device__free(dev);
return NULL;
}
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 );
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;
}
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;
}
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;
}