]> git.proxmox.com Git - mirror_edk2.git/commitdiff
NetworkPkg: Fix the HttpCloseConnection fail issue
authorZhang Lubo <lubo.zhang@intel.com>
Sun, 6 Sep 2015 01:30:44 +0000 (01:30 +0000)
committerluobozhang <luobozhang@Edk2>
Sun, 6 Sep 2015 01:30:44 +0000 (01:30 +0000)
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.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Zhang Lubo <lubo.zhang@intel.com>
Reviewed-by: Fu Siyuan <siyuan.fu@intel.com>
Reviewed-by: Ye Ting <ting.ye@intel.com>
Reviewed-by: Wu Jiaxin <jiaxin.wu@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18400 6f19259b-4bc3-4df7-8a09-765794883524

NetworkPkg/HttpDxe/HttpImpl.c
NetworkPkg/HttpDxe/HttpProto.c

index 5b3c5d058cb1de9fbaec6d43bb3f87dac2118d8f..dc06b9855c279a801cffc5bf3a59638de05adc72 100644 (file)
@@ -516,6 +516,7 @@ Error2:
   HttpCloseTcp4ConnCloseEvent (HttpInstance);\r
   if (NULL != Wrap->TcpWrap.TxToken.CompletionToken.Event) {\r
     gBS->CloseEvent (Wrap->TcpWrap.TxToken.CompletionToken.Event);\r
+    Wrap->TcpWrap.TxToken.CompletionToken.Event = NULL;\r
   }\r
 \r
 Error1:\r
index 829758ad5ea4173e1ab23333cf623912cc025cc7..e8ce9879f309d159a35e2f5f8e2d28b2a0a52dac 100644 (file)
@@ -243,10 +243,12 @@ HttpCloseTcp4ConnCloseEvent (
 \r
   if (NULL != HttpInstance->ConnToken.CompletionToken.Event) {\r
     gBS->CloseEvent (HttpInstance->ConnToken.CompletionToken.Event);\r
+    HttpInstance->ConnToken.CompletionToken.Event = NULL;\r
   }\r
 \r
   if (NULL != HttpInstance->CloseToken.CompletionToken.Event) {\r
     gBS->CloseEvent(HttpInstance->CloseToken.CompletionToken.Event);\r
+    HttpInstance->CloseToken.CompletionToken.Event = NULL;\r
   }  \r
 }\r
 \r
@@ -581,21 +583,22 @@ HttpCloseConnection (
 {\r
   EFI_STATUS                Status;\r
 \r
-  HttpInstance->CloseToken.AbortOnClose = TRUE;\r
-  HttpInstance->IsCloseDone             = FALSE;\r
-  \r
-\r
-  Status = HttpInstance->Tcp4->Close (HttpInstance->Tcp4, &HttpInstance->CloseToken);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
+  if (HttpInstance->State == HTTP_STATE_TCP_CONNECTED) {\r
+    HttpInstance->CloseToken.AbortOnClose = TRUE;\r
+    HttpInstance->IsCloseDone             = FALSE;\r
+    \r
+    Status = HttpInstance->Tcp4->Close (HttpInstance->Tcp4, &HttpInstance->CloseToken);\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
 \r
-  while (!HttpInstance->IsCloseDone) {\r
-    HttpInstance->Tcp4->Poll (HttpInstance->Tcp4);\r
+    while (!HttpInstance->IsCloseDone) {\r
+      HttpInstance->Tcp4->Poll (HttpInstance->Tcp4);\r
+    }\r
   }\r
 \r
   HttpInstance->State = HTTP_STATE_TCP_CLOSED;\r
-  return Status;\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 /**\r