summaryrefslogtreecommitdiffstats
path: root/NetworkPkg/HttpDxe
diff options
context:
space:
mode:
authorGary Lin <glin@suse.com>2016-05-20 11:18:16 +0800
committerJiaxin Wu <jiaxin.wu@intel.com>2016-05-20 12:40:19 +0800
commit6340f2b8587e85fd094261065831546c84b27926 (patch)
treeb2085d1b7e2baa9c139833e085e181f7c47f1ac3 /NetworkPkg/HttpDxe
parent72a4f34eab072132652565dd6bed24ec8d553aac (diff)
downloadedk2-6340f2b8587e85fd094261065831546c84b27926.tar.gz
edk2-6340f2b8587e85fd094261065831546c84b27926.tar.bz2
edk2-6340f2b8587e85fd094261065831546c84b27926.zip
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.wu@intel.com> Cc: "Siyuan Fu" <siyuan.fu@intel.com> Cc: "El-Haj-Mahmoud, Samer" <samer.el-haj-mahmoud@hpe.com> Cc: "Laszlo Ersek" <lersek@redhat.com> Cc: "Hegde, Nagaraj P" <nagaraj-p.hegde@hpe.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Gary Lin <glin@suse.com> Reviewed-by: Samer El-Haj-Mahmoud <elhaj@hpe.com> Reviewed-by: Jiaxin Wu <jiaxin.wu@intel.com> Reviewed-by: Siyuan Fu <siyuan.fu@intel.com>
Diffstat (limited to 'NetworkPkg/HttpDxe')
-rw-r--r--NetworkPkg/HttpDxe/HttpImpl.c1
-rw-r--r--NetworkPkg/HttpDxe/HttpProto.c4
2 files changed, 1 insertions, 4 deletions
diff --git a/NetworkPkg/HttpDxe/HttpImpl.c b/NetworkPkg/HttpDxe/HttpImpl.c
index dd10f826b4..f4ae28aec9 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 f3992edfdc..afa7fe4b35 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);
}
/**