In Ip4CleanService()it first cleaned some resources, then stop the timer .
While before the timer stopped it may try to access some already freed
data, which may generate an exception.
This patch updates the driver to stop the timer event before starting to
clean up the service data.

Cc: Wu Jiaxin <jiaxin...@intel.com>
Cc: Ye Ting <ting...@intel.com>
Cc: Subramanian Sriram <srira...@hpe.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Fu Siyuan <siyuan...@intel.com>
---
 MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c 
b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c
index fb83784..fcd3ccb 100644
--- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c
+++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c
@@ -393,6 +393,15 @@ Ip4CleanService (
 {
   EFI_STATUS                Status;
 
+  IpSb->State     = IP4_SERVICE_DESTROY;
+
+  if (IpSb->Timer != NULL) {
+    gBS->SetTimer (IpSb->Timer, TimerCancel, 0);
+    gBS->CloseEvent (IpSb->Timer);
+
+    IpSb->Timer = NULL;
+  }
+
   if (IpSb->DefaultInterface != NULL) {
     Status = Ip4FreeInterface (IpSb->DefaultInterface, NULL);
 
@@ -432,13 +441,6 @@ Ip4CleanService (
     IpSb->MnpChildHandle = NULL;
   }
 
-  if (IpSb->Timer != NULL) {
-    gBS->SetTimer (IpSb->Timer, TimerCancel, 0);
-    gBS->CloseEvent (IpSb->Timer);
-
-    IpSb->Timer = NULL;
-  }
-
   if (IpSb->ReconfigEvent != NULL) {
     gBS->CloseEvent (IpSb->ReconfigEvent);
 
@@ -750,8 +752,6 @@ Ip4DriverBindingStop (
 
   } else if (IsListEmpty (&IpSb->Children)) {
     State           = IpSb->State;
-    IpSb->State     = IP4_SERVICE_DESTROY;
-
     //
     // OK, clean other resources then uninstall the service binding protocol.
     //
-- 
2.7.4.windows.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to