fixes for NULL verification.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11125 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
jcarsey 2010-12-06 18:10:34 +00:00
parent eca37a3101
commit c154b99708
3 changed files with 109 additions and 105 deletions

View File

@ -183,7 +183,7 @@ GetEnvironmentVariableList(
Status = SHELL_GET_ENVIRONMENT_VARIABLE_AND_ATTRIBUTES(VariableName, &VarList->Atts, &ValSize, VarList->Val);
}
}
if (!EFI_ERROR(Status)) {
if (!EFI_ERROR(Status) && VarList != NULL) {
VarList->Key = AllocatePool(StrSize(VariableName));
if (VarList->Key == NULL) {
SHELL_FREE_NON_NULL(VarList->Val);

View File

@ -907,75 +907,46 @@ InternalOpenFileDevicePath(
if (!EFI_ERROR(Status)) {
Handle1 = ConvertShellHandleToEfiFileProtocol(ShellHandle);
//
// chop off the begining part before the file system part...
//
///@todo BlockIo?
Status = gBS->LocateDevicePath(&gEfiSimpleFileSystemProtocolGuid,
&DevicePath,
&Handle);
if (!EFI_ERROR(Status)) {
if (Handle1 != NULL) {
//
// To access as a file system, the file path should only
// contain file path components. Follow the file path nodes
// and find the target file
// chop off the begining part before the file system part...
//
for ( FilePathNode = (FILEPATH_DEVICE_PATH *)DevicePath
; !IsDevicePathEnd (&FilePathNode->Header)
; FilePathNode = (FILEPATH_DEVICE_PATH *) NextDevicePathNode (&FilePathNode->Header)
){
SHELL_FREE_NON_NULL(AlignedNode);
AlignedNode = AllocateCopyPool (DevicePathNodeLength(FilePathNode), FilePathNode);
///@todo BlockIo?
Status = gBS->LocateDevicePath(&gEfiSimpleFileSystemProtocolGuid,
&DevicePath,
&Handle);
if (!EFI_ERROR(Status)) {
//
// For file system access each node should be a file path component
// To access as a file system, the file path should only
// contain file path components. Follow the file path nodes
// and find the target file
//
if (DevicePathType (&FilePathNode->Header) != MEDIA_DEVICE_PATH ||
DevicePathSubType (&FilePathNode->Header) != MEDIA_FILEPATH_DP
) {
Status = EFI_UNSUPPORTED;
break;
}
//
// Open this file path node
//
Handle2 = Handle1;
Handle1 = NULL;
//
// if this is the last node in the DevicePath always create (if that was requested).
//
if (IsDevicePathEnd ((NextDevicePathNode (&FilePathNode->Header)))) {
Status = Handle2->Open (
Handle2,
&Handle1,
AlignedNode->PathName,
OpenMode,
Attributes
);
} else {
for ( FilePathNode = (FILEPATH_DEVICE_PATH *)DevicePath
; !IsDevicePathEnd (&FilePathNode->Header)
; FilePathNode = (FILEPATH_DEVICE_PATH *) NextDevicePathNode (&FilePathNode->Header)
){
SHELL_FREE_NON_NULL(AlignedNode);
AlignedNode = AllocateCopyPool (DevicePathNodeLength(FilePathNode), FilePathNode);
//
// For file system access each node should be a file path component
//
if (DevicePathType (&FilePathNode->Header) != MEDIA_DEVICE_PATH ||
DevicePathSubType (&FilePathNode->Header) != MEDIA_FILEPATH_DP
) {
Status = EFI_UNSUPPORTED;
break;
}
//
// This is not the last node and we dont want to 'create' existing
// directory entries...
// Open this file path node
//
Handle2 = Handle1;
Handle1 = NULL;
//
// open without letting it create
// prevents error on existing files/directories
// if this is the last node in the DevicePath always create (if that was requested).
//
Status = Handle2->Open (
Handle2,
&Handle1,
AlignedNode->PathName,
OpenMode &~EFI_FILE_MODE_CREATE,
Attributes
);
//
// if above failed now open and create the 'item'
// if OpenMode EFI_FILE_MODE_CREATE bit was on (but disabled above)
//
if ((EFI_ERROR (Status)) && ((OpenMode & EFI_FILE_MODE_CREATE) != 0)) {
if (IsDevicePathEnd ((NextDevicePathNode (&FilePathNode->Header)))) {
Status = Handle2->Open (
Handle2,
&Handle1,
@ -983,20 +954,51 @@ InternalOpenFileDevicePath(
OpenMode,
Attributes
);
}
}
//
// Close the last node
//
ShellInfoObject.NewEfiShellProtocol->CloseFile (Handle2);
} else {
//
// If there's been an error, stop
//
if (EFI_ERROR (Status)) {
break;
}
} // for loop
//
// This is not the last node and we dont want to 'create' existing
// directory entries...
//
//
// open without letting it create
// prevents error on existing files/directories
//
Status = Handle2->Open (
Handle2,
&Handle1,
AlignedNode->PathName,
OpenMode &~EFI_FILE_MODE_CREATE,
Attributes
);
//
// if above failed now open and create the 'item'
// if OpenMode EFI_FILE_MODE_CREATE bit was on (but disabled above)
//
if ((EFI_ERROR (Status)) && ((OpenMode & EFI_FILE_MODE_CREATE) != 0)) {
Status = Handle2->Open (
Handle2,
&Handle1,
AlignedNode->PathName,
OpenMode,
Attributes
);
}
}
//
// Close the last node
//
ShellInfoObject.NewEfiShellProtocol->CloseFile (Handle2);
//
// If there's been an error, stop
//
if (EFI_ERROR (Status)) {
break;
}
} // for loop
}
}
}
SHELL_FREE_NON_NULL(AlignedNode);
@ -2001,7 +2003,7 @@ ShellSearchHandle(
ShellInfoNode->FullName = NewFullName;
}
}
if (Directory && !EFI_ERROR(Status)){
if (Directory && !EFI_ERROR(Status) && ShellInfoNode->FullName != NULL && ShellInfoNode->FileName != NULL){
//
// should be a directory
//
@ -2015,7 +2017,6 @@ ShellSearchHandle(
//
//
//
ASSERT_EFI_ERROR(Status);
if (EFI_ERROR(Status)) {
break;
}

View File

@ -679,18 +679,19 @@ PerformMappingDelete(
return (Status);
}
//
// Get the map name(s) for each one.
//
for ( LoopVar = 0
; LoopVar < BufferSize / sizeof(EFI_HANDLE)
; LoopVar ++
){
if (PerformSingleMappingDelete(Specific,HandleBuffer[LoopVar]) == SHELL_SUCCESS) {
Deleted = TRUE;
if (HandleBuffer != NULL) {
//
// Get the map name(s) for each one.
//
for ( LoopVar = 0
; LoopVar < BufferSize / sizeof(EFI_HANDLE)
; LoopVar ++
){
if (PerformSingleMappingDelete(Specific,HandleBuffer[LoopVar]) == SHELL_SUCCESS) {
Deleted = TRUE;
}
}
}
//
// Look up all BlockIo in the platform
//
@ -718,30 +719,32 @@ PerformMappingDelete(
return (Status);
}
//
// Get the map name(s) for each one.
//
for ( LoopVar = 0
; LoopVar < BufferSize / sizeof(EFI_HANDLE)
; LoopVar ++
){
if (HandleBuffer != NULL) {
//
// Skip any that were already done...
// Get the map name(s) for each one.
//
if (gBS->OpenProtocol(
HandleBuffer[LoopVar],
&gEfiDevicePathProtocolGuid,
NULL,
gImageHandle,
NULL,
EFI_OPEN_PROTOCOL_TEST_PROTOCOL) == EFI_SUCCESS) {
continue;
}
if (PerformSingleMappingDelete(Specific,HandleBuffer[LoopVar]) == SHELL_SUCCESS) {
Deleted = TRUE;
for ( LoopVar = 0
; LoopVar < BufferSize / sizeof(EFI_HANDLE)
; LoopVar ++
){
//
// Skip any that were already done...
//
if (gBS->OpenProtocol(
HandleBuffer[LoopVar],
&gEfiDevicePathProtocolGuid,
NULL,
gImageHandle,
NULL,
EFI_OPEN_PROTOCOL_TEST_PROTOCOL) == EFI_SUCCESS) {
continue;
}
if (PerformSingleMappingDelete(Specific,HandleBuffer[LoopVar]) == SHELL_SUCCESS) {
Deleted = TRUE;
}
}
}
FreePool(HandleBuffer);
SHELL_FREE_NON_NULL(HandleBuffer);
if (!Deleted) {
return (EFI_NOT_FOUND);
}