Sync the bug that list node is free before it is removed from the list. That made the list invalid.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4641 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@@ -51,6 +51,11 @@ SOCK_INIT_DATA mTcp4DefaultSockData = {
|
||||
TCP_SND_BUF_SIZE,
|
||||
TCP_RCV_BUF_SIZE,
|
||||
&mTcp4ProtocolTemplate,
|
||||
Tcp4CreateSocketCallback,
|
||||
Tcp4DestroySocketCallback,
|
||||
NULL,
|
||||
NULL,
|
||||
0,
|
||||
Tcp4Dispatcher,
|
||||
NULL,
|
||||
};
|
||||
@@ -471,6 +476,97 @@ Tcp4DriverBindingStop (
|
||||
return Status;
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
Tcp4CreateSocketCallback (
|
||||
IN SOCKET *This,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
TCP4_SERVICE_DATA *TcpServiceData;
|
||||
EFI_IP4_PROTOCOL *Ip4;
|
||||
|
||||
TcpServiceData = ((TCP4_PROTO_DATA *) This->ProtoReserved)->TcpService;
|
||||
|
||||
//
|
||||
// Open the default Ip4 protocol of IP_IO BY_DRIVER.
|
||||
//
|
||||
Status = gBS->OpenProtocol (
|
||||
TcpServiceData->IpIo->ChildHandle,
|
||||
&gEfiIp4ProtocolGuid,
|
||||
(VOID **) &Ip4,
|
||||
TcpServiceData->DriverBindingHandle,
|
||||
This->SockHandle,
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Open the device path on the handle where service binding resides on.
|
||||
//
|
||||
Status = gBS->OpenProtocol (
|
||||
TcpServiceData->ControllerHandle,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
(VOID **) &This->ParentDevicePath,
|
||||
TcpServiceData->DriverBindingHandle,
|
||||
This->SockHandle,
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
gBS->CloseProtocol (
|
||||
TcpServiceData->IpIo->ChildHandle,
|
||||
&gEfiIp4ProtocolGuid,
|
||||
TcpServiceData->DriverBindingHandle,
|
||||
This->SockHandle
|
||||
);
|
||||
} else {
|
||||
//
|
||||
// Insert this socket into the SocketList.
|
||||
//
|
||||
NetListInsertTail (&TcpServiceData->SocketList, &This->Link);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
VOID
|
||||
Tcp4DestroySocketCallback (
|
||||
IN SOCKET *This,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
TCP4_SERVICE_DATA *TcpServiceData;
|
||||
|
||||
TcpServiceData = ((TCP4_PROTO_DATA *) This->ProtoReserved)->TcpService;
|
||||
|
||||
//
|
||||
// Remove this node from the list.
|
||||
//
|
||||
NetListRemoveEntry (&This->Link);
|
||||
|
||||
//
|
||||
// Close the device path protocol
|
||||
//
|
||||
gBS->CloseProtocol (
|
||||
TcpServiceData->ControllerHandle,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
TcpServiceData->DriverBindingHandle,
|
||||
This->SockHandle
|
||||
);
|
||||
|
||||
//
|
||||
// Close the Ip4 protocol.
|
||||
//
|
||||
gBS->CloseProtocol (
|
||||
TcpServiceData->IpIo->ChildHandle,
|
||||
&gEfiIp4ProtocolGuid,
|
||||
TcpServiceData->DriverBindingHandle,
|
||||
This->SockHandle
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
Creates a child handle with a set of TCP4 services.
|
||||
|
||||
@@ -497,7 +593,6 @@ Tcp4ServiceBindingCreateChild (
|
||||
TCP4_SERVICE_DATA *TcpServiceData;
|
||||
TCP4_PROTO_DATA TcpProto;
|
||||
EFI_STATUS Status;
|
||||
VOID *Ip4;
|
||||
EFI_TPL OldTpl;
|
||||
|
||||
if (NULL == This || NULL == ChildHandle) {
|
||||
@@ -505,6 +600,7 @@ Tcp4ServiceBindingCreateChild (
|
||||
}
|
||||
|
||||
OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);
|
||||
Status = EFI_SUCCESS;
|
||||
TcpServiceData = TCP4_FROM_THIS (This);
|
||||
TcpProto.TcpService = TcpServiceData;
|
||||
TcpProto.TcpPcb = NULL;
|
||||
@@ -513,60 +609,20 @@ Tcp4ServiceBindingCreateChild (
|
||||
// Create a tcp instance with defualt Tcp default
|
||||
// sock init data and TcpProto
|
||||
//
|
||||
mTcp4DefaultSockData.ProtoData = &TcpProto;
|
||||
mTcp4DefaultSockData.DataSize = sizeof (TCP4_PROTO_DATA);
|
||||
mTcp4DefaultSockData.DriverBinding = TcpServiceData->DriverBindingHandle;
|
||||
|
||||
Sock = SockCreateChild (&mTcp4DefaultSockData, &TcpProto, sizeof (TCP4_PROTO_DATA));
|
||||
|
||||
Sock = SockCreateChild (&mTcp4DefaultSockData);
|
||||
if (NULL == Sock) {
|
||||
TCP4_DEBUG_ERROR (("Tcp4DriverBindingCreateChild: "
|
||||
"No resource to create a Tcp Child\n"));
|
||||
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
goto ON_EXIT;
|
||||
}
|
||||
|
||||
*ChildHandle = Sock->SockHandle;
|
||||
|
||||
//
|
||||
// Open the default Ip4 protocol of IP_IO BY_DRIVER.
|
||||
//
|
||||
Status = gBS->OpenProtocol (
|
||||
TcpServiceData->IpIo->ChildHandle,
|
||||
&gEfiIp4ProtocolGuid,
|
||||
(VOID **) &Ip4,
|
||||
TcpServiceData->DriverBindingHandle,
|
||||
Sock->SockHandle,
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
SockDestroyChild (Sock);
|
||||
goto ON_EXIT;
|
||||
}
|
||||
|
||||
//
|
||||
// Open the device path on the handle where service binding resides on.
|
||||
//
|
||||
Status = gBS->OpenProtocol (
|
||||
TcpServiceData->ControllerHandle,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
(VOID **) &Sock->ParentDevicePath,
|
||||
TcpServiceData->DriverBindingHandle,
|
||||
Sock->SockHandle,
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
gBS->CloseProtocol (
|
||||
TcpServiceData->IpIo->ChildHandle,
|
||||
&gEfiIp4ProtocolGuid,
|
||||
TcpServiceData->DriverBindingHandle,
|
||||
Sock->SockHandle
|
||||
);
|
||||
SockDestroyChild (Sock);
|
||||
} else {
|
||||
NetListInsertTail (&TcpServiceData->SocketList, &Sock->Link);
|
||||
*ChildHandle = Sock->SockHandle;
|
||||
}
|
||||
|
||||
ON_EXIT:
|
||||
|
||||
NET_RESTORE_TPL (OldTpl);
|
||||
return Status;
|
||||
}
|
||||
@@ -594,8 +650,6 @@ Tcp4ServiceBindingDestroyChild (
|
||||
EFI_STATUS Status;
|
||||
EFI_TCP4_PROTOCOL *Tcp4;
|
||||
SOCKET *Sock;
|
||||
TCP4_PROTO_DATA *TcpProtoData;
|
||||
TCP4_SERVICE_DATA *TcpServiceData;
|
||||
EFI_TPL OldTpl;
|
||||
|
||||
if (NULL == This || NULL == ChildHandle) {
|
||||
@@ -617,42 +671,17 @@ Tcp4ServiceBindingDestroyChild (
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Status = EFI_UNSUPPORTED;
|
||||
goto ON_EXIT;
|
||||
} else {
|
||||
//
|
||||
// destroy this sock and related Tcp protocol control
|
||||
// block
|
||||
//
|
||||
Sock = SOCK_FROM_THIS (Tcp4);
|
||||
|
||||
SockDestroyChild (Sock);
|
||||
}
|
||||
|
||||
//
|
||||
// destroy this sock and related Tcp protocol control
|
||||
// block
|
||||
//
|
||||
Sock = SOCK_FROM_THIS (Tcp4);
|
||||
TcpProtoData = (TCP4_PROTO_DATA *) Sock->ProtoReserved;
|
||||
TcpServiceData = TcpProtoData->TcpService;
|
||||
|
||||
NetListRemoveEntry (&Sock->Link);
|
||||
|
||||
SockDestroyChild (Sock);
|
||||
|
||||
//
|
||||
// Close the device path protocol
|
||||
//
|
||||
gBS->CloseProtocol (
|
||||
TcpServiceData->ControllerHandle,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
TcpServiceData->DriverBindingHandle,
|
||||
ChildHandle
|
||||
);
|
||||
|
||||
//
|
||||
// Close the Ip4 protocol.
|
||||
//
|
||||
gBS->CloseProtocol (
|
||||
TcpServiceData->IpIo->ChildHandle,
|
||||
&gEfiIp4ProtocolGuid,
|
||||
TcpServiceData->DriverBindingHandle,
|
||||
ChildHandle
|
||||
);
|
||||
|
||||
ON_EXIT:
|
||||
NET_RESTORE_TPL (OldTpl);
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user