From 7027b268bf1887f7393487574dba309fda84bb74 Mon Sep 17 00:00:00 2001 From: Zhang Lubo Date: Sun, 6 Sep 2015 02:18:22 +0000 Subject: 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. (Sync patch r18400 from main trunk.) Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Zhang Lubo Reviewed-by: Fu Siyuan Reviewed-by: Ye Ting Reviewed-by: Wu Jiaxin git-svn-id: https://svn.code.sf.net/p/edk2/code/branches/UDK2015@18402 6f19259b-4bc3-4df7-8a09-765794883524 --- NetworkPkg/HttpDxe/HttpImpl.c | 1 + NetworkPkg/HttpDxe/HttpProto.c | 25 ++++++++++++++----------- 2 files changed, 15 insertions(+), 11 deletions(-) (limited to 'NetworkPkg') diff --git a/NetworkPkg/HttpDxe/HttpImpl.c b/NetworkPkg/HttpDxe/HttpImpl.c index 5b3c5d058c..dc06b9855c 100644 --- a/NetworkPkg/HttpDxe/HttpImpl.c +++ b/NetworkPkg/HttpDxe/HttpImpl.c @@ -516,6 +516,7 @@ Error2: HttpCloseTcp4ConnCloseEvent (HttpInstance); if (NULL != Wrap->TcpWrap.TxToken.CompletionToken.Event) { gBS->CloseEvent (Wrap->TcpWrap.TxToken.CompletionToken.Event); + Wrap->TcpWrap.TxToken.CompletionToken.Event = NULL; } Error1: diff --git a/NetworkPkg/HttpDxe/HttpProto.c b/NetworkPkg/HttpDxe/HttpProto.c index 829758ad5e..e8ce9879f3 100644 --- a/NetworkPkg/HttpDxe/HttpProto.c +++ b/NetworkPkg/HttpDxe/HttpProto.c @@ -243,10 +243,12 @@ HttpCloseTcp4ConnCloseEvent ( 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; } } @@ -581,21 +583,22 @@ HttpCloseConnection ( { 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; } /** -- cgit v1.2.3