X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=MdeModulePkg%2FUniversal%2FNetwork%2FUdp4Dxe%2FUdp4Driver.c;h=7a7c184498688cbebe59654bb95e41a5dde47059;hp=7e2bc451ae2e85082224408f142eb535fc43704a;hb=c4a62a12c2890297cfcb9828b51b058fb347c01a;hpb=372787b85a2a6a6da0a7b0357f58953da26d81a8 diff --git a/MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Driver.c b/MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Driver.c index 7e2bc451ae..7a7c184498 100644 --- a/MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Driver.c +++ b/MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Driver.c @@ -123,7 +123,8 @@ Udp4DriverBindingStart ( Status = Udp4CreateService (Udp4Service, This->DriverBindingHandle, ControllerHandle); if (EFI_ERROR (Status)) { - goto FREE_SERVICE; + NetFreePool (Udp4Service); + return Status; } // @@ -136,21 +137,12 @@ Udp4DriverBindingStart ( NULL ); if (EFI_ERROR (Status)) { - goto CLEAN_SERVICE; + Udp4CleanService (Udp4Service); + NetFreePool (Udp4Service); + } else { + Udp4SetVariableData (Udp4Service); } - Udp4SetVariableData (Udp4Service); - - return Status; - -CLEAN_SERVICE: - - Udp4CleanService (Udp4Service); - -FREE_SERVICE: - - NetFreePool (Udp4Service); - return Status; } @@ -188,7 +180,7 @@ Udp4DriverBindingStop ( // NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp4ProtocolGuid); if (NicHandle == NULL) { - return EFI_SUCCESS; + return EFI_DEVICE_ERROR; } // @@ -208,35 +200,30 @@ Udp4DriverBindingStop ( Udp4Service = UDP4_SERVICE_DATA_FROM_THIS (ServiceBinding); - // - // Uninstall the UDP4 ServiceBinding Protocol. - // - Status = gBS->UninstallMultipleProtocolInterfaces ( - NicHandle, - &gEfiUdp4ServiceBindingProtocolGuid, - &Udp4Service->ServiceBinding, - NULL - ); - if (EFI_ERROR (Status)) { - return EFI_DEVICE_ERROR; - } + if (NumberOfChildren == 0) { - while (!NetListIsEmpty (&Udp4Service->ChildrenList)) { - // - // Destroy all instances. - // - Instance = NET_LIST_HEAD (&Udp4Service->ChildrenList, UDP4_INSTANCE_DATA, Link); + gBS->UninstallMultipleProtocolInterfaces ( + NicHandle, + &gEfiUdp4ServiceBindingProtocolGuid, + &Udp4Service->ServiceBinding, + NULL + ); - ServiceBinding->DestroyChild (ServiceBinding, Instance->ChildHandle); - } + Udp4ClearVariableData (Udp4Service); - Udp4ClearVariableData (Udp4Service); + Udp4CleanService (Udp4Service); - Udp4CleanService (Udp4Service); + NetFreePool (Udp4Service); + } else { - NetFreePool (Udp4Service); + while (!NetListIsEmpty (&Udp4Service->ChildrenList)) { + Instance = NET_LIST_HEAD (&Udp4Service->ChildrenList, UDP4_INSTANCE_DATA, Link); - return EFI_SUCCESS; + ServiceBinding->DestroyChild (ServiceBinding, Instance->ChildHandle); + } + } + + return Status; } @@ -277,7 +264,7 @@ Udp4ServiceBindingCreateChild ( // // Allocate the instance private data structure. // - Instance = NetAllocatePool (sizeof (UDP4_INSTANCE_DATA)); + Instance = NetAllocateZeroPool (sizeof (UDP4_INSTANCE_DATA)); if (Instance == NULL) { return EFI_OUT_OF_RESOURCES; } @@ -290,7 +277,7 @@ Udp4ServiceBindingCreateChild ( Instance->IpInfo = IpIoAddIp (Udp4Service->IpIo); if (Instance->IpInfo == NULL) { Status = EFI_OUT_OF_RESOURCES; - goto FREE_INSTANCE; + goto ON_ERROR; } // @@ -303,7 +290,7 @@ Udp4ServiceBindingCreateChild ( NULL ); if (EFI_ERROR (Status)) { - goto REMOVE_IPINFO; + goto ON_ERROR; } Instance->ChildHandle = *ChildHandle; @@ -320,7 +307,7 @@ Udp4ServiceBindingCreateChild ( EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER ); if (EFI_ERROR (Status)) { - goto UNINSTALL_PROTOCOL; + goto ON_ERROR; } OldTpl = NET_RAISE_TPL (NET_TPL_LOCK); @@ -333,22 +320,22 @@ Udp4ServiceBindingCreateChild ( NET_RESTORE_TPL (OldTpl); - return Status; - -UNINSTALL_PROTOCOL: - - gBS->UninstallMultipleProtocolInterfaces ( - Instance->ChildHandle, - &gEfiUdp4ProtocolGuid, - &Instance->Udp4Proto, - NULL - ); + return EFI_SUCCESS; -REMOVE_IPINFO: +ON_ERROR: - IpIoRemoveIp (Udp4Service->IpIo, Instance->IpInfo); + if (Instance->ChildHandle != NULL) { + gBS->UninstallMultipleProtocolInterfaces ( + Instance->ChildHandle, + &gEfiUdp4ProtocolGuid, + &Instance->Udp4Proto, + NULL + ); + } -FREE_INSTANCE: + if (Instance->IpInfo != NULL) { + IpIoRemoveIp (Udp4Service->IpIo, Instance->IpInfo); + } Udp4CleanInstance (Instance);