From 8322eb77ce4ccdf803a769e8799e13f0834b6bb4 Mon Sep 17 00:00:00 2001 From: tye1 Date: Mon, 17 Jan 2011 05:54:13 +0000 Subject: Enhance the code to avoid the potential of return address of local variable to output structure. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11255 6f19259b-4bc3-4df7-8a09-765794883524 --- MdeModulePkg/Include/Library/TcpIoLib.h | 5 +-- MdeModulePkg/Library/DxeTcpIoLib/DxeTcpIoLib.c | 45 +++++++++++++++----------- 2 files changed, 30 insertions(+), 20 deletions(-) (limited to 'MdeModulePkg') diff --git a/MdeModulePkg/Include/Library/TcpIoLib.h b/MdeModulePkg/Include/Library/TcpIoLib.h index 050f14b28f..49008bdefc 100644 --- a/MdeModulePkg/Include/Library/TcpIoLib.h +++ b/MdeModulePkg/Include/Library/TcpIoLib.h @@ -2,7 +2,7 @@ This library is used to share code between UEFI network stack modules. It provides the helper routines to access TCP service. -Copyright (c) 2010, Intel Corporation. All rights reserved.
+Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at
@@ -114,10 +114,11 @@ typedef struct { @retval EFI_INVALID_PARAMETER One or more parameters are invalid. @retval EFI_UNSUPPORTED One or more of the control options are not supported in the implementation. + @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. @retval Others Failed to create the TCP socket or configure it. **/ -EFI_STATUS +EFI_STATUS EFIAPI TcpIoCreateSocket ( IN EFI_HANDLE Image, diff --git a/MdeModulePkg/Library/DxeTcpIoLib/DxeTcpIoLib.c b/MdeModulePkg/Library/DxeTcpIoLib/DxeTcpIoLib.c index 2a65422e1c..730ccb2caf 100644 --- a/MdeModulePkg/Library/DxeTcpIoLib/DxeTcpIoLib.c +++ b/MdeModulePkg/Library/DxeTcpIoLib/DxeTcpIoLib.c @@ -2,7 +2,7 @@ This library is used to share code between UEFI network stack modules. It provides the helper routines to access TCP service. -Copyright (c) 2010, Intel Corporation. All rights reserved.
+Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at
@@ -123,6 +123,7 @@ ON_EXIT: @retval EFI_INVALID_PARAMETER One or more parameters are invalid. @retval EFI_UNSUPPORTED One or more of the control options are not supported in the implementation. + @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. @retval Others Failed to create the TCP socket or configure it. **/ @@ -148,6 +149,7 @@ TcpIoCreateSocket ( EFI_TCP6_CONFIG_DATA Tcp6ConfigData; EFI_TCP6_ACCESS_POINT *AccessPoint6; EFI_TCP6_PROTOCOL *Tcp6; + EFI_TCP4_RECEIVE_DATA *RxData; if ((Image == NULL) || (Controller == NULL) || (ConfigData == NULL) || (TcpIo == NULL)) { return EFI_INVALID_PARAMETER; @@ -363,6 +365,14 @@ TcpIoCreateSocket ( TcpIo->RxToken.Tcp4Token.CompletionToken.Event = Event; + RxData = (EFI_TCP4_RECEIVE_DATA *) AllocateZeroPool (sizeof (EFI_TCP4_RECEIVE_DATA)); + if (RxData == NULL) { + Status = EFI_OUT_OF_RESOURCES; + goto ON_ERROR; + } + + TcpIo->RxToken.Tcp4Token.Packet.RxData = RxData; + Status = gBS->CreateEvent ( EVT_NOTIFY_SIGNAL, TPL_NOTIFY, @@ -446,6 +456,10 @@ TcpIoDestroySocket ( gBS->CloseEvent (Event); } + if (TcpIo->RxToken.Tcp4Token.Packet.RxData != NULL) { + FreePool (TcpIo->RxToken.Tcp4Token.Packet.RxData); + } + Tcp4 = NULL; Tcp6 = NULL; @@ -868,7 +882,7 @@ TcpIoReceive ( { EFI_TCP4_PROTOCOL *Tcp4; EFI_TCP6_PROTOCOL *Tcp6; - EFI_TCP4_RECEIVE_DATA RxData; + EFI_TCP4_RECEIVE_DATA *RxData; EFI_STATUS Status; NET_FRAGMENT *Fragment; UINT32 FragmentCount; @@ -878,6 +892,11 @@ TcpIoReceive ( return EFI_INVALID_PARAMETER; } + RxData = TcpIo->RxToken.Tcp4Token.Packet.RxData; + if (RxData == NULL) { + return EFI_INVALID_PARAMETER; + } + Tcp4 = NULL; Tcp6 = NULL; @@ -892,8 +911,6 @@ TcpIoReceive ( return EFI_DEVICE_ERROR; } - TcpIo->RxToken.Tcp4Token.Packet.RxData = &RxData; - } else if (TcpIo->TcpVersion == TCP_VERSION_6) { Tcp6 = TcpIo->Tcp.Tcp6; @@ -905,8 +922,6 @@ TcpIoReceive ( return EFI_DEVICE_ERROR; } - TcpIo->RxToken.Tcp6Token.Packet.RxData = (EFI_TCP6_RECEIVE_DATA *) &RxData; - } else { return EFI_UNSUPPORTED; } @@ -922,14 +937,14 @@ TcpIoReceive ( // NetbufBuildExt (Packet, Fragment, &FragmentCount); - RxData.FragmentCount = 1; + RxData->FragmentCount = 1; CurrentFragment = 0; Status = EFI_SUCCESS; while (CurrentFragment < FragmentCount) { - RxData.DataLength = Fragment[CurrentFragment].Len; - RxData.FragmentTable[0].FragmentLength = Fragment[CurrentFragment].Len; - RxData.FragmentTable[0].FragmentBuffer = Fragment[CurrentFragment].Bulk; + RxData->DataLength = Fragment[CurrentFragment].Len; + RxData->FragmentTable[0].FragmentLength = Fragment[CurrentFragment].Len; + RxData->FragmentTable[0].FragmentBuffer = Fragment[CurrentFragment].Bulk; if (TcpIo->TcpVersion == TCP_VERSION_4) { Status = Tcp4->Receive (Tcp4, &TcpIo->RxToken.Tcp4Token); @@ -974,22 +989,16 @@ TcpIoReceive ( goto ON_EXIT; } - Fragment[CurrentFragment].Len -= RxData.FragmentTable[0].FragmentLength; + Fragment[CurrentFragment].Len -= RxData->FragmentTable[0].FragmentLength; if (Fragment[CurrentFragment].Len == 0) { CurrentFragment++; } else { - Fragment[CurrentFragment].Bulk += RxData.FragmentTable[0].FragmentLength; + Fragment[CurrentFragment].Bulk += RxData->FragmentTable[0].FragmentLength; } } ON_EXIT: - if (TcpIo->TcpVersion == TCP_VERSION_4) { - TcpIo->RxToken.Tcp4Token.Packet.RxData = NULL; - } else { - TcpIo->RxToken.Tcp6Token.Packet.RxData = NULL; - } - if (Fragment != NULL) { FreePool (Fragment); } -- cgit v1.2.3