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