mirror of https://github.com/acidanthera/audk.git
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
This commit is contained in:
parent
b57cc035da
commit
8322eb77ce
|
@ -2,7 +2,7 @@
|
||||||
This library is used to share code between UEFI network stack modules.
|
This library is used to share code between UEFI network stack modules.
|
||||||
It provides the helper routines to access TCP service.
|
It provides the helper routines to access TCP service.
|
||||||
|
|
||||||
Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
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<BR>
|
which accompanies this distribution. The full text of the license may be found at<BR>
|
||||||
|
@ -114,10 +114,11 @@ typedef struct {
|
||||||
@retval EFI_INVALID_PARAMETER One or more parameters are invalid.
|
@retval EFI_INVALID_PARAMETER One or more parameters are invalid.
|
||||||
@retval EFI_UNSUPPORTED One or more of the control options are not
|
@retval EFI_UNSUPPORTED One or more of the control options are not
|
||||||
supported in the implementation.
|
supported in the implementation.
|
||||||
|
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
|
||||||
@retval Others Failed to create the TCP socket or configure it.
|
@retval Others Failed to create the TCP socket or configure it.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
TcpIoCreateSocket (
|
TcpIoCreateSocket (
|
||||||
IN EFI_HANDLE Image,
|
IN EFI_HANDLE Image,
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
This library is used to share code between UEFI network stack modules.
|
This library is used to share code between UEFI network stack modules.
|
||||||
It provides the helper routines to access TCP service.
|
It provides the helper routines to access TCP service.
|
||||||
|
|
||||||
Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
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<BR>
|
which accompanies this distribution. The full text of the license may be found at<BR>
|
||||||
|
@ -123,6 +123,7 @@ ON_EXIT:
|
||||||
@retval EFI_INVALID_PARAMETER One or more parameters are invalid.
|
@retval EFI_INVALID_PARAMETER One or more parameters are invalid.
|
||||||
@retval EFI_UNSUPPORTED One or more of the control options are not
|
@retval EFI_UNSUPPORTED One or more of the control options are not
|
||||||
supported in the implementation.
|
supported in the implementation.
|
||||||
|
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
|
||||||
@retval Others Failed to create the TCP socket or configure it.
|
@retval Others Failed to create the TCP socket or configure it.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
@ -148,6 +149,7 @@ TcpIoCreateSocket (
|
||||||
EFI_TCP6_CONFIG_DATA Tcp6ConfigData;
|
EFI_TCP6_CONFIG_DATA Tcp6ConfigData;
|
||||||
EFI_TCP6_ACCESS_POINT *AccessPoint6;
|
EFI_TCP6_ACCESS_POINT *AccessPoint6;
|
||||||
EFI_TCP6_PROTOCOL *Tcp6;
|
EFI_TCP6_PROTOCOL *Tcp6;
|
||||||
|
EFI_TCP4_RECEIVE_DATA *RxData;
|
||||||
|
|
||||||
if ((Image == NULL) || (Controller == NULL) || (ConfigData == NULL) || (TcpIo == NULL)) {
|
if ((Image == NULL) || (Controller == NULL) || (ConfigData == NULL) || (TcpIo == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
|
@ -363,6 +365,14 @@ TcpIoCreateSocket (
|
||||||
|
|
||||||
TcpIo->RxToken.Tcp4Token.CompletionToken.Event = Event;
|
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 (
|
Status = gBS->CreateEvent (
|
||||||
EVT_NOTIFY_SIGNAL,
|
EVT_NOTIFY_SIGNAL,
|
||||||
TPL_NOTIFY,
|
TPL_NOTIFY,
|
||||||
|
@ -446,6 +456,10 @@ TcpIoDestroySocket (
|
||||||
gBS->CloseEvent (Event);
|
gBS->CloseEvent (Event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (TcpIo->RxToken.Tcp4Token.Packet.RxData != NULL) {
|
||||||
|
FreePool (TcpIo->RxToken.Tcp4Token.Packet.RxData);
|
||||||
|
}
|
||||||
|
|
||||||
Tcp4 = NULL;
|
Tcp4 = NULL;
|
||||||
Tcp6 = NULL;
|
Tcp6 = NULL;
|
||||||
|
|
||||||
|
@ -868,7 +882,7 @@ TcpIoReceive (
|
||||||
{
|
{
|
||||||
EFI_TCP4_PROTOCOL *Tcp4;
|
EFI_TCP4_PROTOCOL *Tcp4;
|
||||||
EFI_TCP6_PROTOCOL *Tcp6;
|
EFI_TCP6_PROTOCOL *Tcp6;
|
||||||
EFI_TCP4_RECEIVE_DATA RxData;
|
EFI_TCP4_RECEIVE_DATA *RxData;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
NET_FRAGMENT *Fragment;
|
NET_FRAGMENT *Fragment;
|
||||||
UINT32 FragmentCount;
|
UINT32 FragmentCount;
|
||||||
|
@ -878,6 +892,11 @@ TcpIoReceive (
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RxData = TcpIo->RxToken.Tcp4Token.Packet.RxData;
|
||||||
|
if (RxData == NULL) {
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
Tcp4 = NULL;
|
Tcp4 = NULL;
|
||||||
Tcp6 = NULL;
|
Tcp6 = NULL;
|
||||||
|
|
||||||
|
@ -892,8 +911,6 @@ TcpIoReceive (
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
TcpIo->RxToken.Tcp4Token.Packet.RxData = &RxData;
|
|
||||||
|
|
||||||
} else if (TcpIo->TcpVersion == TCP_VERSION_6) {
|
} else if (TcpIo->TcpVersion == TCP_VERSION_6) {
|
||||||
Tcp6 = TcpIo->Tcp.Tcp6;
|
Tcp6 = TcpIo->Tcp.Tcp6;
|
||||||
|
|
||||||
|
@ -905,8 +922,6 @@ TcpIoReceive (
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
TcpIo->RxToken.Tcp6Token.Packet.RxData = (EFI_TCP6_RECEIVE_DATA *) &RxData;
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
@ -922,14 +937,14 @@ TcpIoReceive (
|
||||||
//
|
//
|
||||||
NetbufBuildExt (Packet, Fragment, &FragmentCount);
|
NetbufBuildExt (Packet, Fragment, &FragmentCount);
|
||||||
|
|
||||||
RxData.FragmentCount = 1;
|
RxData->FragmentCount = 1;
|
||||||
CurrentFragment = 0;
|
CurrentFragment = 0;
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
|
|
||||||
while (CurrentFragment < FragmentCount) {
|
while (CurrentFragment < FragmentCount) {
|
||||||
RxData.DataLength = Fragment[CurrentFragment].Len;
|
RxData->DataLength = Fragment[CurrentFragment].Len;
|
||||||
RxData.FragmentTable[0].FragmentLength = Fragment[CurrentFragment].Len;
|
RxData->FragmentTable[0].FragmentLength = Fragment[CurrentFragment].Len;
|
||||||
RxData.FragmentTable[0].FragmentBuffer = Fragment[CurrentFragment].Bulk;
|
RxData->FragmentTable[0].FragmentBuffer = Fragment[CurrentFragment].Bulk;
|
||||||
|
|
||||||
if (TcpIo->TcpVersion == TCP_VERSION_4) {
|
if (TcpIo->TcpVersion == TCP_VERSION_4) {
|
||||||
Status = Tcp4->Receive (Tcp4, &TcpIo->RxToken.Tcp4Token);
|
Status = Tcp4->Receive (Tcp4, &TcpIo->RxToken.Tcp4Token);
|
||||||
|
@ -974,22 +989,16 @@ TcpIoReceive (
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
Fragment[CurrentFragment].Len -= RxData.FragmentTable[0].FragmentLength;
|
Fragment[CurrentFragment].Len -= RxData->FragmentTable[0].FragmentLength;
|
||||||
if (Fragment[CurrentFragment].Len == 0) {
|
if (Fragment[CurrentFragment].Len == 0) {
|
||||||
CurrentFragment++;
|
CurrentFragment++;
|
||||||
} else {
|
} else {
|
||||||
Fragment[CurrentFragment].Bulk += RxData.FragmentTable[0].FragmentLength;
|
Fragment[CurrentFragment].Bulk += RxData->FragmentTable[0].FragmentLength;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ON_EXIT:
|
ON_EXIT:
|
||||||
|
|
||||||
if (TcpIo->TcpVersion == TCP_VERSION_4) {
|
|
||||||
TcpIo->RxToken.Tcp4Token.Packet.RxData = NULL;
|
|
||||||
} else {
|
|
||||||
TcpIo->RxToken.Tcp6Token.Packet.RxData = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Fragment != NULL) {
|
if (Fragment != NULL) {
|
||||||
FreePool (Fragment);
|
FreePool (Fragment);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue