Reviewed-by: Fu Siyuan <siyuan...@intel.com>

> -----Original Message-----
> From: Gary Lin [mailto:g...@suse.com]
> Sent: Friday, May 20, 2016 11:18 AM
> To: edk2-devel@lists.01.org
> Cc: Wu, Jiaxin <jiaxin...@intel.com>; Fu, Siyuan <siyuan...@intel.com>; El-
> Haj-Mahmoud, Samer <samer.el-haj-mahm...@hpe.com>; Laszlo Ersek
> <ler...@redhat.com>; Hegde, Nagaraj P <nagaraj-p.he...@hpe.com>
> Subject: [PATCH v2] NetworkPkg/HttpDxe: Don't free Wrap in
> HttpTcpReceiveNotifyDpc
> 
> The HTTP Token Wrap is created in EfiHttpResponse() and then passed
> to the deferred Receive event callback, HttpTcpReceiveNotifyDpc.
> HttpTcpReceiveHeader and HttpTcpReceiveBody use a Tcp polling loop to
> monitor the socket status and trigger the Receive event when a new
> packet arrives. The Receive event brings up HttpTcpReceiveNotifyDpc
> to process the HTTP message and the function will set Wrap-
> >TcpWrap.IsRxDone
> to TRUE to break the Tcp polling loop.
> 
> However, HttpTcpReceiveNotifyDpc mistakenly freed Wrap, so the Tcp
> polling loop was actually checking a dead variable, and this led the
> system into an unstable status.
> 
> Given the fact that the HTTP Token Wrap will be freed in EfiHttpResponse
> or HttpResponseWorker, this commit removes every "FreePool (Wrap)" in
> HttpTcpReceiveNotifyDpc.
> 
> v2:
> * Free Wrap after HttpTcpReceiveBody returns normally.
> 
> Cc: "Wu, Jiaxin" <jiaxin...@intel.com>
> Cc: "Siyuan Fu" <siyuan...@intel.com>
> Cc: "El-Haj-Mahmoud, Samer" <samer.el-haj-mahm...@hpe.com>
> Cc: "Laszlo Ersek" <ler...@redhat.com>
> Cc: "Hegde, Nagaraj P" <nagaraj-p.he...@hpe.com>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Gary Lin <g...@suse.com>
> ---
>  NetworkPkg/HttpDxe/HttpImpl.c  | 1 +
>  NetworkPkg/HttpDxe/HttpProto.c | 4 ----
>  2 files changed, 1 insertion(+), 4 deletions(-)
> 
> diff --git a/NetworkPkg/HttpDxe/HttpImpl.c
> b/NetworkPkg/HttpDxe/HttpImpl.c
> index dd10f82..f4ae28a 100644
> --- a/NetworkPkg/HttpDxe/HttpImpl.c
> +++ b/NetworkPkg/HttpDxe/HttpImpl.c
> @@ -1237,6 +1237,7 @@ HttpResponseWorker (
>      goto Error;
>    }
> 
> +  FreePool (Wrap);
>    return Status;
> 
>  Exit:
> diff --git a/NetworkPkg/HttpDxe/HttpProto.c
> b/NetworkPkg/HttpDxe/HttpProto.c
> index f3992ed..afa7fe4 100644
> --- a/NetworkPkg/HttpDxe/HttpProto.c
> +++ b/NetworkPkg/HttpDxe/HttpProto.c
> @@ -152,7 +152,6 @@ HttpTcpReceiveNotifyDpc (
>      if (EFI_ERROR (Wrap->TcpWrap.Rx6Token.CompletionToken.Status)) {
>        Wrap->HttpToken->Status = Wrap-
> >TcpWrap.Rx6Token.CompletionToken.Status;
>        gBS->SignalEvent (Wrap->HttpToken->Event);
> -      FreePool (Wrap);
>        return ;
>      }
> 
> @@ -162,7 +161,6 @@ HttpTcpReceiveNotifyDpc (
>      if (EFI_ERROR (Wrap->TcpWrap.Rx4Token.CompletionToken.Status)) {
>        Wrap->HttpToken->Status = Wrap-
> >TcpWrap.Rx4Token.CompletionToken.Status;
>        gBS->SignalEvent (Wrap->HttpToken->Event);
> -      FreePool (Wrap);
>        return ;
>      }
>    }
> @@ -234,8 +232,6 @@ HttpTcpReceiveNotifyDpc (
>    // Check pending RxTokens and receive the HTTP message.
>    //
>    NetMapIterate (&Wrap->HttpInstance->RxTokens, HttpTcpReceive, NULL);
> -
> -  FreePool (Wrap);
>  }
> 
>  /**
> --
> 2.8.2

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

Reply via email to