ShellPkg/EfiDecompress: Fix Codeql issues Fix codeql reported issues by flattening MainCmdEfiDecompress(), making it easier for the tool to evaluate potential risks. Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/EfiDecompress.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/EfiDecompress.c index 32788e7..9129844 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/EfiDecompress.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/EfiDecompress.c
@@ -76,14 +76,12 @@ if (ShellIsDirectory (InFileName) == EFI_SUCCESS) { ShellPrintHiiDefaultEx (STRING_TOKEN (STR_FILE_NOT_DIR), gShellDebug1HiiHandle, L"efidecompress", InFileName); ShellStatus = SHELL_INVALID_PARAMETER; + goto Done; } if (ShellIsDirectory (OutFileName) == EFI_SUCCESS) { ShellPrintHiiDefaultEx (STRING_TOKEN (STR_FILE_NOT_DIR), gShellDebug1HiiHandle, L"efidecompress", OutFileName); ShellStatus = SHELL_INVALID_PARAMETER; - } - - if (ShellStatus != SHELL_SUCCESS) { goto Done; } @@ -114,51 +112,59 @@ InBuffer = AllocateZeroPool (InSize); if (InBuffer == NULL) { - Status = EFI_OUT_OF_RESOURCES; - } else { - Status = gEfiShellProtocol->ReadFile (InFileHandle, &InSize, InBuffer); - ASSERT_EFI_ERROR (Status); - - Status = gBS->LocateProtocol (&gEfiDecompressProtocolGuid, NULL, (VOID **)&Decompress); - if (EFI_ERROR (Status)) { - ASSERT_EFI_ERROR (Status); - ShellStatus = SHELL_NOT_FOUND; - goto Done; - } - - Status = Decompress->GetInfo (Decompress, InBuffer, (UINT32)InSize, &OutSize, &ScratchSize); + ShellStatus = SHELL_OUT_OF_RESOURCES; + goto Done; } + Status = gEfiShellProtocol->ReadFile (InFileHandle, &InSize, InBuffer); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + ShellStatus = SHELL_DEVICE_ERROR; + goto Done; + } + + Status = gBS->LocateProtocol (&gEfiDecompressProtocolGuid, NULL, (VOID **)&Decompress); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + ShellStatus = SHELL_NOT_FOUND; + goto Done; + } + + Status = Decompress->GetInfo (Decompress, InBuffer, (UINT32)InSize, &OutSize, &ScratchSize); if (EFI_ERROR (Status) || (OutSize == 0)) { ShellPrintHiiDefaultEx (STRING_TOKEN (STR_EFI_DECOMPRESS_NOPE), gShellDebug1HiiHandle, InFileName); ShellStatus = SHELL_NOT_FOUND; - } else { - Status = ShellOpenFileByName (OutFileName, &OutFileHandle, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE|EFI_FILE_MODE_CREATE, 0); - if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_FILE_OPEN_FAIL), gShellDebug1HiiHandle, ShellCommandLineGetRawValue (Package, 2), Status); - ShellStatus = SHELL_NOT_FOUND; - } else { - OutBuffer = AllocateZeroPool (OutSize); - ScratchBuffer = AllocateZeroPool (ScratchSize); - if ((OutBuffer == NULL) || (ScratchBuffer == NULL)) { - Status = EFI_OUT_OF_RESOURCES; - } else { - Status = Decompress->Decompress (Decompress, InBuffer, (UINT32)InSize, OutBuffer, OutSize, ScratchBuffer, ScratchSize); - } - } + goto Done; } + Status = ShellOpenFileByName (OutFileName, &OutFileHandle, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE|EFI_FILE_MODE_CREATE, 0); + if (EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_FILE_OPEN_FAIL), gShellDebug1HiiHandle, ShellCommandLineGetRawValue (Package, 2), Status); + ShellStatus = SHELL_NOT_FOUND; + goto Done; + } + + OutBuffer = AllocateZeroPool (OutSize); + ScratchBuffer = AllocateZeroPool (ScratchSize); + if ((OutBuffer == NULL) || (ScratchBuffer == NULL)) { + ShellStatus = SHELL_OUT_OF_RESOURCES; + goto Done; + } + + Status = Decompress->Decompress (Decompress, InBuffer, (UINT32)InSize, OutBuffer, OutSize, ScratchBuffer, ScratchSize); if (EFI_ERROR (Status)) { ShellPrintHiiDefaultEx (STRING_TOKEN (STR_EFI_DECOMPRESS_FAIL), gShellDebug1HiiHandle, Status); ShellStatus = ((Status == EFI_OUT_OF_RESOURCES) ? SHELL_OUT_OF_RESOURCES : SHELL_DEVICE_ERROR); - } else { - OutSizeTemp = OutSize; - Status = gEfiShellProtocol->WriteFile (OutFileHandle, &OutSizeTemp, OutBuffer); - OutSize = (UINT32)OutSizeTemp; - if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_FILE_WRITE_FAIL), gShellDebug1HiiHandle, L"efidecompress", OutFileName, Status); - ShellStatus = SHELL_DEVICE_ERROR; - } + goto Done; + } + + OutSizeTemp = OutSize; + Status = gEfiShellProtocol->WriteFile (OutFileHandle, &OutSizeTemp, OutBuffer); + OutSize = (UINT32)OutSizeTemp; + if (EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_FILE_WRITE_FAIL), gShellDebug1HiiHandle, L"efidecompress", OutFileName, Status); + ShellStatus = SHELL_DEVICE_ERROR; + goto Done; } Done: