When HTTP server is unavailable,HttpCloseConnection will enter
infinite loop to wait for TCP4->close Event return, So we need to
decide the Http Instance state whether in the appropriate state
before close it.

Cc: Fu Siyuan<siyuan...@intel.com>
Cc: Ye Ting<ting...@intel.com>
CC: Wu Jiaxin <jiaxin...@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Zhang Lubo <lubo.zh...@intel.com>
---
 NetworkPkg/HttpDxe/HttpImpl.c  |  1 +
 NetworkPkg/HttpDxe/HttpProto.c | 25 ++++++++++++++-----------
 2 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/NetworkPkg/HttpDxe/HttpImpl.c b/NetworkPkg/HttpDxe/HttpImpl.c
index 5b3c5d0..dc06b98 100644
--- a/NetworkPkg/HttpDxe/HttpImpl.c
+++ b/NetworkPkg/HttpDxe/HttpImpl.c
@@ -514,10 +514,11 @@ Error3:
 
 Error2:
   HttpCloseTcp4ConnCloseEvent (HttpInstance);
   if (NULL != Wrap->TcpWrap.TxToken.CompletionToken.Event) {
     gBS->CloseEvent (Wrap->TcpWrap.TxToken.CompletionToken.Event);
+    Wrap->TcpWrap.TxToken.CompletionToken.Event = NULL;
   }
 
 Error1:
   if (Url != NULL) {
     FreePool (Url);
diff --git a/NetworkPkg/HttpDxe/HttpProto.c b/NetworkPkg/HttpDxe/HttpProto.c
index 829758a..e8ce987 100644
--- a/NetworkPkg/HttpDxe/HttpProto.c
+++ b/NetworkPkg/HttpDxe/HttpProto.c
@@ -241,14 +241,16 @@ HttpCloseTcp4ConnCloseEvent (
 {
   ASSERT (HttpInstance != NULL);
 
   if (NULL != HttpInstance->ConnToken.CompletionToken.Event) {
     gBS->CloseEvent (HttpInstance->ConnToken.CompletionToken.Event);
+    HttpInstance->ConnToken.CompletionToken.Event = NULL;
   }
 
   if (NULL != HttpInstance->CloseToken.CompletionToken.Event) {
     gBS->CloseEvent(HttpInstance->CloseToken.CompletionToken.Event);
+    HttpInstance->CloseToken.CompletionToken.Event = NULL;
   }  
 }
 
 /**
   Create event for the TCP4 transmit token.
@@ -579,25 +581,26 @@ HttpCloseConnection (
   IN  HTTP_PROTOCOL        *HttpInstance
   )
 {
   EFI_STATUS                Status;
 
-  HttpInstance->CloseToken.AbortOnClose = TRUE;
-  HttpInstance->IsCloseDone             = FALSE;
-  
-
-  Status = HttpInstance->Tcp4->Close (HttpInstance->Tcp4, 
&HttpInstance->CloseToken);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
+  if (HttpInstance->State == HTTP_STATE_TCP_CONNECTED) {
+    HttpInstance->CloseToken.AbortOnClose = TRUE;
+    HttpInstance->IsCloseDone             = FALSE;
+    
+    Status = HttpInstance->Tcp4->Close (HttpInstance->Tcp4, 
&HttpInstance->CloseToken);
+    if (EFI_ERROR (Status)) {
+      return Status;
+    }
 
-  while (!HttpInstance->IsCloseDone) {
-    HttpInstance->Tcp4->Poll (HttpInstance->Tcp4);
+    while (!HttpInstance->IsCloseDone) {
+      HttpInstance->Tcp4->Poll (HttpInstance->Tcp4);
+    }
   }
 
   HttpInstance->State = HTTP_STATE_TCP_CLOSED;
-  return Status;
+  return EFI_SUCCESS;
 }
 
 /**
   Configure TCP4 protocol child.
 
-- 
1.9.5.msysgit.1

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

Reply via email to