- Fix a major logic bug in device tree traversal functions

svn path=/trunk/; revision=53350
This commit is contained in:
Cameron Gutman 2011-08-21 02:40:58 +00:00
parent 6272d3ffc8
commit ea045872b7

View file

@ -1346,10 +1346,7 @@ cleanup:
* Pointer to parent node to retrieve child node information for. * Pointer to parent node to retrieve child node information for.
* *
* Remarks * Remarks
* We only return a status code indicating an error (STATUS_UNSUCCESSFUL) * Any errors that occur are logged instead so that all child services have a chance
* when we reach a device node which is not a direct child of the device
* node for which we retrieve information of child nodes for. Any errors
* that occur is logged instead so that all child services have a chance
* of being interrogated. * of being interrogated.
*/ */
@ -1395,9 +1392,8 @@ IopActionInterrogateDeviceStack(PDEVICE_NODE DeviceNode,
if (DeviceNode->Parent != ParentDeviceNode) if (DeviceNode->Parent != ParentDeviceNode)
{ {
/* Stop the traversal immediately and indicate successful operation */ DPRINT("Skipping 2+ level child\n");
DPRINT("Stop\n"); return STATUS_SUCCESS;
return STATUS_UNSUCCESSFUL;
} }
/* Skip processing if it was already completed before */ /* Skip processing if it was already completed before */
@ -1963,10 +1959,7 @@ IopEnumerateDevice(
* Pointer to parent node to retrieve child node configuration for. * Pointer to parent node to retrieve child node configuration for.
* *
* Remarks * Remarks
* We only return a status code indicating an error (STATUS_UNSUCCESSFUL) * Any errors that occur are logged instead so that all child services have a chance of beeing
* when we reach a device node which is not a direct child of the device
* node for which we configure child services for. Any errors that occur is
* logged instead so that all child services have a chance of beeing
* configured. * configured.
*/ */
@ -1999,11 +1992,11 @@ IopActionConfigureChildServices(PDEVICE_NODE DeviceNode,
* Make sure this device node is a direct child of the parent device node * Make sure this device node is a direct child of the parent device node
* that is given as an argument * that is given as an argument
*/ */
if (DeviceNode->Parent != ParentDeviceNode) if (DeviceNode->Parent != ParentDeviceNode)
{ {
/* Stop the traversal immediately and indicate successful operation */ DPRINT("Skipping 2+ level child\n");
DPRINT("Stop\n"); return STATUS_SUCCESS;
return STATUS_UNSUCCESSFUL;
} }
if (!(DeviceNode->Flags & (DNF_DISABLED | DNF_STARTED | DNF_ADDED))) if (!(DeviceNode->Flags & (DNF_DISABLED | DNF_STARTED | DNF_ADDED)))
@ -2096,10 +2089,7 @@ IopActionConfigureChildServices(PDEVICE_NODE DeviceNode,
* *
* Remarks * Remarks
* If the driver image for a service is not loaded and initialized * If the driver image for a service is not loaded and initialized
* it is done here too. We only return a status code indicating an * it is done here too. Any errors that occur are logged instead so
* error (STATUS_UNSUCCESSFUL) when we reach a device node which is
* not a direct child of the device node for which we initialize
* child services for. Any errors that occur is logged instead so
* that all child services have a chance of being initialized. * that all child services have a chance of being initialized.
*/ */
@ -2132,11 +2122,8 @@ IopActionInitChildServices(PDEVICE_NODE DeviceNode,
if (DeviceNode->Parent != ParentDeviceNode) if (DeviceNode->Parent != ParentDeviceNode)
{ {
/* DPRINT("Skipping 2+ level child\n");
* Stop the traversal immediately and indicate unsuccessful operation return STATUS_SUCCESS;
*/
DPRINT("Stop\n");
return STATUS_UNSUCCESSFUL;
} }
if (IopDeviceNodeHasFlag(DeviceNode, DNF_STARTED) || if (IopDeviceNodeHasFlag(DeviceNode, DNF_STARTED) ||