[Description]:

Fixed one bug in PciBus. PciBus doesn't clear the bridges bus number for all the root bridges before scanning any of them.
[Description]:
 The static IP configuration no long works in the EDK 1.04 network package. The cause is that changing the type of EFI_IP4_IPCONFIG_DATA.RouteTable from a variable length array to a pointer is not clean. If the whole structure is read from variable, the pointer is invalid.
[Solution]
Fix the pointer before using it
[Impaction]:
 Ip4ConfigDxe module.
[Reference Info]:
 EDK tracker 1134 - Static IP configuration no long works. 



git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5291 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
vanjeff 2008-05-26 08:16:25 +00:00
parent b96b676f11
commit 7659d0c92f
3 changed files with 37 additions and 5 deletions

View File

@ -1,6 +1,6 @@
/** @file
Copyright (c) 2006 - 2007, Intel Corporation
Copyright (c) 2006 - 2008, 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
@ -180,6 +180,7 @@ EfiNicIp4ConfigGetInfo (
} else {
Status = EFI_SUCCESS;
CopyMem (NicConfig, Config, Len);
Ip4ConfigFixRouteTablePointer (&NicConfig->Ip4Info);
}
*ConfigLen = Len;
@ -272,6 +273,7 @@ EfiNicIp4ConfigSetInfo (
//
if (Reconfig && (Instance->ReconfigEvent != NULL)) {
Status = gBS->SignalEvent (Instance->ReconfigEvent);
NetLibDispatchDpc ();
}
return Status;
@ -442,6 +444,8 @@ ON_ERROR:
ON_EXIT:
gBS->RestoreTPL (OldTpl);
NetLibDispatchDpc ();
return Status;
}
@ -555,6 +559,7 @@ EfiIp4ConfigGetData (
Status = EFI_BUFFER_TOO_SMALL;
} else {
CopyMem (ConfigData, &NicConfig->Ip4Info, Len);
Ip4ConfigFixRouteTablePointer (ConfigData);
}
*ConfigDataSize = Len;
@ -676,6 +681,9 @@ Ip4ConfigOnDhcp4Complete (
ON_EXIT:
gBS->SignalEvent (Instance->DoneEvent);
Ip4ConfigCleanDhcp4 (Instance);
NetLibDispatchDpc ();
return ;
}

View File

@ -1,6 +1,6 @@
/** @file
Copyright (c) 2006, Intel Corporation
Copyright (c) 2006 - 2008, 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
@ -249,6 +249,7 @@ Ip4ConfigFindNicVariable (
}
CopyMem (Config, Cur, Len);
Ip4ConfigFixRouteTablePointer (&Config->Ip4Info);
return Config;
}
@ -381,3 +382,20 @@ Ip4ConfigModifyVariable (
NewVar->CheckSum = (UINT16) (~NetblockChecksum ((UINT8 *) NewVar, TotalLen));
return NewVar;
}
VOID
Ip4ConfigFixRouteTablePointer (
IN EFI_IP4_IPCONFIG_DATA *ConfigData
)
{
//
// The memory used for route table entries must immediately follow
// the ConfigData and be not packed.
//
if (ConfigData->RouteTableSize > 0) {
ConfigData->RouteTable = (EFI_IP4_ROUTE_TABLE *) (ConfigData + 1);
} else {
ConfigData->RouteTable = NULL;
}
}

View File

@ -1,6 +1,6 @@
/** @file
Copyright (c) 2006, Intel Corporation
Copyright (c) 2006 - 2008, 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
@ -32,11 +32,11 @@ Abstract:
//
#define SIZEOF_IP4_CONFIG_INFO(Ip4Config) \
(sizeof (EFI_IP4_IPCONFIG_DATA) + \
sizeof (EFI_IP4_ROUTE_TABLE) * (MAX (1, (Ip4Config)->RouteTableSize) - 1))
sizeof (EFI_IP4_ROUTE_TABLE) * (Ip4Config)->RouteTableSize)
#define SIZEOF_NIC_IP4_CONFIG_INFO(NicConfig) \
(sizeof (NIC_IP4_CONFIG_INFO) + \
sizeof (EFI_IP4_ROUTE_TABLE) * (MAX (1, (NicConfig)->Ip4Info.RouteTableSize) - 1))
sizeof (EFI_IP4_ROUTE_TABLE) * (NicConfig)->Ip4Info.RouteTableSize)
//
// Compare whether two NIC address are equal includes their type and length.
@ -72,4 +72,10 @@ Ip4ConfigModifyVariable (
IN NIC_ADDR *NicAddr,
IN NIC_IP4_CONFIG_INFO *Config OPTIONAL
);
VOID
Ip4ConfigFixRouteTablePointer (
IN EFI_IP4_IPCONFIG_DATA *ConfigData
);
#endif