X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=NetworkPkg%2FHttpDxe%2FHttpProto.c;h=486b20304f5274be71b35026c09c3f715438914b;hp=afa7fe4b3508bf7b286b45c715f745196db2df7c;hb=30526a51dda7e8db483f22a045f32f3a18eea5c7;hpb=6340f2b8587e85fd094261065831546c84b27926 diff --git a/NetworkPkg/HttpDxe/HttpProto.c b/NetworkPkg/HttpDxe/HttpProto.c index afa7fe4b35..486b20304f 100644 --- a/NetworkPkg/HttpDxe/HttpProto.c +++ b/NetworkPkg/HttpDxe/HttpProto.c @@ -148,19 +148,41 @@ HttpTcpReceiveNotifyDpc ( if (UsingIpv6) { gBS->CloseEvent (Wrap->TcpWrap.Rx6Token.CompletionToken.Event); + Wrap->TcpWrap.Rx6Token.CompletionToken.Event = NULL; if (EFI_ERROR (Wrap->TcpWrap.Rx6Token.CompletionToken.Status)) { + DEBUG ((EFI_D_ERROR, "HttpTcpReceiveNotifyDpc: %r!\n", Wrap->TcpWrap.Rx6Token.CompletionToken.Status)); Wrap->HttpToken->Status = Wrap->TcpWrap.Rx6Token.CompletionToken.Status; gBS->SignalEvent (Wrap->HttpToken->Event); + + Item = NetMapFindKey (&HttpInstance->RxTokens, Wrap->HttpToken); + if (Item != NULL) { + NetMapRemoveItem (&HttpInstance->RxTokens, Item, NULL); + } + + FreePool (Wrap); + Wrap = NULL; + return ; } } else { gBS->CloseEvent (Wrap->TcpWrap.Rx4Token.CompletionToken.Event); + Wrap->TcpWrap.Rx4Token.CompletionToken.Event = NULL; if (EFI_ERROR (Wrap->TcpWrap.Rx4Token.CompletionToken.Status)) { + DEBUG ((EFI_D_ERROR, "HttpTcpReceiveNotifyDpc: %r!\n", Wrap->TcpWrap.Rx4Token.CompletionToken.Status)); Wrap->HttpToken->Status = Wrap->TcpWrap.Rx4Token.CompletionToken.Status; gBS->SignalEvent (Wrap->HttpToken->Event); + + Item = NetMapFindKey (&HttpInstance->RxTokens, Wrap->HttpToken); + if (Item != NULL) { + NetMapRemoveItem (&HttpInstance->RxTokens, Item, NULL); + } + + FreePool (Wrap); + Wrap = NULL; + return ; } } @@ -232,6 +254,9 @@ HttpTcpReceiveNotifyDpc ( // Check pending RxTokens and receive the HTTP message. // NetMapIterate (&Wrap->HttpInstance->RxTokens, HttpTcpReceive, NULL); + + FreePool (Wrap); + Wrap = NULL; } /** @@ -408,15 +433,15 @@ HttpCreateTcpTxEvent ( Wrap, &TcpWrap->Tx4Token.CompletionToken.Event ); - if (EFI_ERROR (Status)) { - return Status; - } - - TcpWrap->Tx4Data.Push = TRUE; - TcpWrap->Tx4Data.Urgent = FALSE; - TcpWrap->Tx4Data.FragmentCount = 1; - TcpWrap->Tx4Token.Packet.TxData = &Wrap->TcpWrap.Tx4Data; - TcpWrap->Tx4Token.CompletionToken.Status = EFI_NOT_READY; + if (EFI_ERROR (Status)) { + return Status; + } + + TcpWrap->Tx4Data.Push = TRUE; + TcpWrap->Tx4Data.Urgent = FALSE; + TcpWrap->Tx4Data.FragmentCount = 1; + TcpWrap->Tx4Token.Packet.TxData = &Wrap->TcpWrap.Tx4Data; + TcpWrap->Tx4Token.CompletionToken.Status = EFI_NOT_READY; } else { Status = gBS->CreateEvent ( @@ -436,7 +461,6 @@ HttpCreateTcpTxEvent ( TcpWrap->Tx6Token.Packet.TxData = &Wrap->TcpWrap.Tx6Data; TcpWrap->Tx6Token.CompletionToken.Status =EFI_NOT_READY; - } return EFI_SUCCESS; @@ -1607,6 +1631,10 @@ HttpTcpReceiveHeader ( } if (!HttpInstance->IsRxDone) { + // + // Cancle the Token before close its Event. + // + Tcp4->Cancel (HttpInstance->Tcp4, &Rx4Token->CompletionToken); gBS->CloseEvent (Rx4Token->CompletionToken.Event); Rx4Token->CompletionToken.Status = EFI_TIMEOUT; } @@ -1673,6 +1701,10 @@ HttpTcpReceiveHeader ( } if (!HttpInstance->IsRxDone) { + // + // Cancle the Token before close its Event. + // + Tcp6->Cancel (HttpInstance->Tcp6, &Rx6Token->CompletionToken); gBS->CloseEvent (Rx6Token->CompletionToken.Event); Rx6Token->CompletionToken.Status = EFI_TIMEOUT; } @@ -1728,7 +1760,6 @@ HttpTcpReceiveHeader ( @param[in] Wrap The HTTP token's wrap data. @param[in] HttpMsg The HTTP message data. - @param[in] Timeout The time to wait for receiving the body packet. @retval EFI_SUCCESS The HTTP body is received. @retval Others Other error as indicated. @@ -1737,8 +1768,7 @@ HttpTcpReceiveHeader ( EFI_STATUS HttpTcpReceiveBody ( IN HTTP_TOKEN_WRAP *Wrap, - IN EFI_HTTP_MESSAGE *HttpMsg, - IN EFI_EVENT Timeout + IN EFI_HTTP_MESSAGE *HttpMsg ) { EFI_STATUS Status; @@ -1772,17 +1802,6 @@ HttpTcpReceiveBody ( DEBUG ((EFI_D_ERROR, "Tcp6 receive failed: %r\n", Status)); return Status; } - - while (!Wrap->TcpWrap.IsRxDone && ((Timeout == NULL) || EFI_ERROR (gBS->CheckEvent (Timeout)))) { - Tcp6->Poll (Tcp6); - } - - if (!Wrap->TcpWrap.IsRxDone) { - gBS->CloseEvent (Rx6Token->CompletionToken.Event); - Rx6Token->CompletionToken.Status = EFI_TIMEOUT; - Wrap->HttpToken->Status = Rx6Token->CompletionToken.Status; - gBS->SignalEvent (Wrap->HttpToken->Event); - } } else { Rx4Token = &Wrap->TcpWrap.Rx4Token; Rx4Token->Packet.RxData->DataLength = (UINT32) HttpMsg->BodyLength; @@ -1795,17 +1814,6 @@ HttpTcpReceiveBody ( DEBUG ((EFI_D_ERROR, "Tcp4 receive failed: %r\n", Status)); return Status; } - - while (!Wrap->TcpWrap.IsRxDone && ((Timeout == NULL) || EFI_ERROR (gBS->CheckEvent (Timeout)))) { - Tcp4->Poll (Tcp4); - } - - if (!Wrap->TcpWrap.IsRxDone) { - gBS->CloseEvent (Rx4Token->CompletionToken.Event); - Rx4Token->CompletionToken.Status = EFI_TIMEOUT; - Wrap->HttpToken->Status = Rx4Token->CompletionToken.Status; - gBS->SignalEvent (Wrap->HttpToken->Event); - } } return EFI_SUCCESS;