mirror of https://github.com/acidanthera/audk.git
The Driver Binding Protocol Stop() function for the UndiRuntimeDxe is performing actions in the incorrect order. The call to UninstallMultipleProtocolInterfaces() removes all the protocols from the child handle, which means ChildHandleBuffer[Index] is no longer valid. After the call to UninstallMultipleProtocolInterfaces(), ChildHandleBuffer[Index] is used again in a call to CloseProtocol(). The handle is not valid, so CloseProtocol() returns an error and generates an ASSERT().
This patch changes the order to call CloseProtocol() before calling UninstallMultipleProtocolInterfaces(). Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Michael Kinney <michael.d.kinney@intel.com> Reviewed-by: Erik Bjorge <erik.c.bjorge@intel.com> git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13781 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
bbcafc442b
commit
4a823e23b1
|
@ -1,7 +1,7 @@
|
|||
/** @file
|
||||
Initialization functions for EFI UNDI32 driver.
|
||||
|
||||
Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
|
@ -616,38 +616,38 @@ UndiDriverStop (
|
|||
|
||||
UNDI32Device = UNDI_DEV_FROM_THIS (NIIProtocol);
|
||||
|
||||
Status = gBS->UninstallMultipleProtocolInterfaces (
|
||||
ChildHandleBuffer[Index],
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
UNDI32Device->Undi32DevPath,
|
||||
&gEfiNetworkInterfaceIdentifierProtocolGuid_31,
|
||||
&UNDI32Device->NIIProtocol_31,
|
||||
NULL
|
||||
Status = gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiPciIoProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
ChildHandleBuffer[Index]
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
//
|
||||
// Restore original PCI attributes
|
||||
//
|
||||
Status = UNDI32Device->NicInfo.Io_Function->Attributes (
|
||||
UNDI32Device->NicInfo.Io_Function,
|
||||
EfiPciIoAttributeOperationSet,
|
||||
UNDI32Device->NicInfo.OriginalPciAttributes,
|
||||
NULL
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
Status = gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiPciIoProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
ChildHandleBuffer[Index]
|
||||
Status = gBS->UninstallMultipleProtocolInterfaces (
|
||||
ChildHandleBuffer[Index],
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
UNDI32Device->Undi32DevPath,
|
||||
&gEfiNetworkInterfaceIdentifierProtocolGuid_31,
|
||||
&UNDI32Device->NIIProtocol_31,
|
||||
NULL
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
//
|
||||
// Restore original PCI attributes
|
||||
//
|
||||
Status = UNDI32Device->NicInfo.Io_Function->Attributes (
|
||||
UNDI32Device->NicInfo.Io_Function,
|
||||
EfiPciIoAttributeOperationSet,
|
||||
UNDI32Device->NicInfo.OriginalPciAttributes,
|
||||
NULL
|
||||
);
|
||||
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
gBS->FreePool (UNDI32Device->Undi32DevPath);
|
||||
gBS->FreePool (UNDI32Device);
|
||||
gBS->FreePool (UNDI32Device->Undi32DevPath);
|
||||
gBS->FreePool (UNDI32Device);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue