Reviewed-by: Fu Siyuan <siyuan...@intel.com> -----Original Message----- From: Zhang, Lubo Sent: Wednesday, September 2, 2015 3:55 PM To: edk2-devel@lists.01.org Cc: Fu, Siyuan <siyuan...@intel.com>; Ye, Ting <ting...@intel.com>; Wu, Jiaxin <jiaxin...@intel.com> Subject: [patch] NetworkPkg: Fix the HttpCloseConnection fail issue
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