ShellPkg: Refine code to use Strn**S safe functions instead of Str**S ones in some cases.

Safe string functions may ASSERT when the source length is larger than the MaxDest. This patch use Strn**S to indicate the copy length. 

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Qiu Shumin <shumin.qiu@intel.com>
Reviewed-by: Tapan Shah <<tapandshah@hp.com>>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17894 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Qiu Shumin 2015-07-09 03:19:06 +00:00 committed by shenshushi
parent 3b87e3881e
commit 4dc0d578b8
5 changed files with 44 additions and 39 deletions

View File

@ -509,7 +509,7 @@ FileInterfaceStdInRead(
if (StrStr(CurrentString + TabPos, L":") == NULL) { if (StrStr(CurrentString + TabPos, L":") == NULL) {
Cwd = ShellInfoObject.NewEfiShellProtocol->GetCurDir(NULL); Cwd = ShellInfoObject.NewEfiShellProtocol->GetCurDir(NULL);
if (Cwd != NULL) { if (Cwd != NULL) {
StrCpyS(TabStr, (*BufferSize)/sizeof(CHAR16), Cwd); StrnCpyS(TabStr, (*BufferSize)/sizeof(CHAR16), Cwd, (*BufferSize)/sizeof(CHAR16) - 1);
if (TabStr[StrLen(TabStr)-1] == L'\\' && *(CurrentString + TabPos) == L'\\' ) { if (TabStr[StrLen(TabStr)-1] == L'\\' && *(CurrentString + TabPos) == L'\\' ) {
TabStr[StrLen(TabStr)-1] = CHAR_NULL; TabStr[StrLen(TabStr)-1] = CHAR_NULL;
} }
@ -523,7 +523,7 @@ FileInterfaceStdInRead(
StrnCatS(TabStr, (*BufferSize)/sizeof(CHAR16), CurrentString + TabPos, StringLen - TabPos); StrnCatS(TabStr, (*BufferSize)/sizeof(CHAR16), CurrentString + TabPos, StringLen - TabPos);
} }
} else { } else {
StrCpyS(TabStr, (*BufferSize)/sizeof(CHAR16), CurrentString + TabPos); StrnCpyS(TabStr, (*BufferSize)/sizeof(CHAR16), CurrentString + TabPos, (*BufferSize)/sizeof(CHAR16) - 1);
} }
StrnCatS(TabStr, (*BufferSize)/sizeof(CHAR16), L"*", (*BufferSize)/sizeof(CHAR16) - 1 - StrLen(TabStr)); StrnCatS(TabStr, (*BufferSize)/sizeof(CHAR16), L"*", (*BufferSize)/sizeof(CHAR16) - 1 - StrLen(TabStr));
FoundFileList = NULL; FoundFileList = NULL;

View File

@ -2564,6 +2564,7 @@ RunScriptFileHandle (
EFI_STATUS Status; EFI_STATUS Status;
SCRIPT_FILE *NewScriptFile; SCRIPT_FILE *NewScriptFile;
UINTN LoopVar; UINTN LoopVar;
UINTN PrintBuffSize;
CHAR16 *CommandLine; CHAR16 *CommandLine;
CHAR16 *CommandLine2; CHAR16 *CommandLine2;
CHAR16 *CommandLine3; CHAR16 *CommandLine3;
@ -2578,6 +2579,7 @@ RunScriptFileHandle (
ASSERT(!ShellCommandGetScriptExit()); ASSERT(!ShellCommandGetScriptExit());
PreScriptEchoState = ShellCommandGetEchoState(); PreScriptEchoState = ShellCommandGetEchoState();
PrintBuffSize = PcdGet16(PcdShellPrintBufferSize);
NewScriptFile = (SCRIPT_FILE*)AllocateZeroPool(sizeof(SCRIPT_FILE)); NewScriptFile = (SCRIPT_FILE*)AllocateZeroPool(sizeof(SCRIPT_FILE));
if (NewScriptFile == NULL) { if (NewScriptFile == NULL) {
@ -2652,12 +2654,12 @@ RunScriptFileHandle (
// //
// Now enumerate through the commands and run each one. // Now enumerate through the commands and run each one.
// //
CommandLine = AllocateZeroPool(PcdGet16(PcdShellPrintBufferSize)); CommandLine = AllocateZeroPool(PrintBuffSize);
if (CommandLine == NULL) { if (CommandLine == NULL) {
DeleteScriptFileStruct(NewScriptFile); DeleteScriptFileStruct(NewScriptFile);
return (EFI_OUT_OF_RESOURCES); return (EFI_OUT_OF_RESOURCES);
} }
CommandLine2 = AllocateZeroPool(PcdGet16(PcdShellPrintBufferSize)); CommandLine2 = AllocateZeroPool(PrintBuffSize);
if (CommandLine2 == NULL) { if (CommandLine2 == NULL) {
FreePool(CommandLine); FreePool(CommandLine);
DeleteScriptFileStruct(NewScriptFile); DeleteScriptFileStruct(NewScriptFile);
@ -2669,9 +2671,10 @@ RunScriptFileHandle (
; // conditional increment in the body of the loop ; // conditional increment in the body of the loop
){ ){
ASSERT(CommandLine2 != NULL); ASSERT(CommandLine2 != NULL);
StrCpyS( CommandLine2, StrnCpyS( CommandLine2,
PcdGet16(PcdShellPrintBufferSize)/sizeof(CHAR16), PrintBuffSize/sizeof(CHAR16),
NewScriptFile->CurrentCommand->Cl NewScriptFile->CurrentCommand->Cl,
PrintBuffSize/sizeof(CHAR16) - 1
); );
// //
@ -2693,9 +2696,10 @@ RunScriptFileHandle (
// //
// Due to variability in starting the find and replace action we need to have both buffers the same. // Due to variability in starting the find and replace action we need to have both buffers the same.
// //
StrCpyS( CommandLine, StrnCpyS( CommandLine,
PcdGet16(PcdShellPrintBufferSize)/sizeof(CHAR16), PrintBuffSize/sizeof(CHAR16),
CommandLine2 CommandLine2,
PrintBuffSize/sizeof(CHAR16) - 1
); );
// //
@ -2704,53 +2708,54 @@ RunScriptFileHandle (
if (NewScriptFile->Argv != NULL) { if (NewScriptFile->Argv != NULL) {
switch (NewScriptFile->Argc) { switch (NewScriptFile->Argc) {
default: default:
Status = ShellCopySearchAndReplace(CommandLine2, CommandLine, PcdGet16 (PcdShellPrintBufferSize), L"%9", NewScriptFile->Argv[9], FALSE, TRUE); Status = ShellCopySearchAndReplace(CommandLine2, CommandLine, PrintBuffSize, L"%9", NewScriptFile->Argv[9], FALSE, TRUE);
ASSERT_EFI_ERROR(Status); ASSERT_EFI_ERROR(Status);
case 9: case 9:
Status = ShellCopySearchAndReplace(CommandLine, CommandLine2, PcdGet16 (PcdShellPrintBufferSize), L"%8", NewScriptFile->Argv[8], FALSE, TRUE); Status = ShellCopySearchAndReplace(CommandLine, CommandLine2, PrintBuffSize, L"%8", NewScriptFile->Argv[8], FALSE, TRUE);
ASSERT_EFI_ERROR(Status); ASSERT_EFI_ERROR(Status);
case 8: case 8:
Status = ShellCopySearchAndReplace(CommandLine2, CommandLine, PcdGet16 (PcdShellPrintBufferSize), L"%7", NewScriptFile->Argv[7], FALSE, TRUE); Status = ShellCopySearchAndReplace(CommandLine2, CommandLine, PrintBuffSize, L"%7", NewScriptFile->Argv[7], FALSE, TRUE);
ASSERT_EFI_ERROR(Status); ASSERT_EFI_ERROR(Status);
case 7: case 7:
Status = ShellCopySearchAndReplace(CommandLine, CommandLine2, PcdGet16 (PcdShellPrintBufferSize), L"%6", NewScriptFile->Argv[6], FALSE, TRUE); Status = ShellCopySearchAndReplace(CommandLine, CommandLine2, PrintBuffSize, L"%6", NewScriptFile->Argv[6], FALSE, TRUE);
ASSERT_EFI_ERROR(Status); ASSERT_EFI_ERROR(Status);
case 6: case 6:
Status = ShellCopySearchAndReplace(CommandLine2, CommandLine, PcdGet16 (PcdShellPrintBufferSize), L"%5", NewScriptFile->Argv[5], FALSE, TRUE); Status = ShellCopySearchAndReplace(CommandLine2, CommandLine, PrintBuffSize, L"%5", NewScriptFile->Argv[5], FALSE, TRUE);
ASSERT_EFI_ERROR(Status); ASSERT_EFI_ERROR(Status);
case 5: case 5:
Status = ShellCopySearchAndReplace(CommandLine, CommandLine2, PcdGet16 (PcdShellPrintBufferSize), L"%4", NewScriptFile->Argv[4], FALSE, TRUE); Status = ShellCopySearchAndReplace(CommandLine, CommandLine2, PrintBuffSize, L"%4", NewScriptFile->Argv[4], FALSE, TRUE);
ASSERT_EFI_ERROR(Status); ASSERT_EFI_ERROR(Status);
case 4: case 4:
Status = ShellCopySearchAndReplace(CommandLine2, CommandLine, PcdGet16 (PcdShellPrintBufferSize), L"%3", NewScriptFile->Argv[3], FALSE, TRUE); Status = ShellCopySearchAndReplace(CommandLine2, CommandLine, PrintBuffSize, L"%3", NewScriptFile->Argv[3], FALSE, TRUE);
ASSERT_EFI_ERROR(Status); ASSERT_EFI_ERROR(Status);
case 3: case 3:
Status = ShellCopySearchAndReplace(CommandLine, CommandLine2, PcdGet16 (PcdShellPrintBufferSize), L"%2", NewScriptFile->Argv[2], FALSE, TRUE); Status = ShellCopySearchAndReplace(CommandLine, CommandLine2, PrintBuffSize, L"%2", NewScriptFile->Argv[2], FALSE, TRUE);
ASSERT_EFI_ERROR(Status); ASSERT_EFI_ERROR(Status);
case 2: case 2:
Status = ShellCopySearchAndReplace(CommandLine2, CommandLine, PcdGet16 (PcdShellPrintBufferSize), L"%1", NewScriptFile->Argv[1], FALSE, TRUE); Status = ShellCopySearchAndReplace(CommandLine2, CommandLine, PrintBuffSize, L"%1", NewScriptFile->Argv[1], FALSE, TRUE);
ASSERT_EFI_ERROR(Status); ASSERT_EFI_ERROR(Status);
case 1: case 1:
Status = ShellCopySearchAndReplace(CommandLine, CommandLine2, PcdGet16 (PcdShellPrintBufferSize), L"%0", NewScriptFile->Argv[0], FALSE, TRUE); Status = ShellCopySearchAndReplace(CommandLine, CommandLine2, PrintBuffSize, L"%0", NewScriptFile->Argv[0], FALSE, TRUE);
ASSERT_EFI_ERROR(Status); ASSERT_EFI_ERROR(Status);
break; break;
case 0: case 0:
break; break;
} }
} }
Status = ShellCopySearchAndReplace(CommandLine2, CommandLine, PcdGet16 (PcdShellPrintBufferSize), L"%1", L"\"\"", FALSE, FALSE); Status = ShellCopySearchAndReplace(CommandLine2, CommandLine, PrintBuffSize, L"%1", L"\"\"", FALSE, FALSE);
Status = ShellCopySearchAndReplace(CommandLine, CommandLine2, PcdGet16 (PcdShellPrintBufferSize), L"%2", L"\"\"", FALSE, FALSE); Status = ShellCopySearchAndReplace(CommandLine, CommandLine2, PrintBuffSize, L"%2", L"\"\"", FALSE, FALSE);
Status = ShellCopySearchAndReplace(CommandLine2, CommandLine, PcdGet16 (PcdShellPrintBufferSize), L"%3", L"\"\"", FALSE, FALSE); Status = ShellCopySearchAndReplace(CommandLine2, CommandLine, PrintBuffSize, L"%3", L"\"\"", FALSE, FALSE);
Status = ShellCopySearchAndReplace(CommandLine, CommandLine2, PcdGet16 (PcdShellPrintBufferSize), L"%4", L"\"\"", FALSE, FALSE); Status = ShellCopySearchAndReplace(CommandLine, CommandLine2, PrintBuffSize, L"%4", L"\"\"", FALSE, FALSE);
Status = ShellCopySearchAndReplace(CommandLine2, CommandLine, PcdGet16 (PcdShellPrintBufferSize), L"%5", L"\"\"", FALSE, FALSE); Status = ShellCopySearchAndReplace(CommandLine2, CommandLine, PrintBuffSize, L"%5", L"\"\"", FALSE, FALSE);
Status = ShellCopySearchAndReplace(CommandLine, CommandLine2, PcdGet16 (PcdShellPrintBufferSize), L"%6", L"\"\"", FALSE, FALSE); Status = ShellCopySearchAndReplace(CommandLine, CommandLine2, PrintBuffSize, L"%6", L"\"\"", FALSE, FALSE);
Status = ShellCopySearchAndReplace(CommandLine2, CommandLine, PcdGet16 (PcdShellPrintBufferSize), L"%7", L"\"\"", FALSE, FALSE); Status = ShellCopySearchAndReplace(CommandLine2, CommandLine, PrintBuffSize, L"%7", L"\"\"", FALSE, FALSE);
Status = ShellCopySearchAndReplace(CommandLine, CommandLine2, PcdGet16 (PcdShellPrintBufferSize), L"%8", L"\"\"", FALSE, FALSE); Status = ShellCopySearchAndReplace(CommandLine, CommandLine2, PrintBuffSize, L"%8", L"\"\"", FALSE, FALSE);
Status = ShellCopySearchAndReplace(CommandLine2, CommandLine, PcdGet16 (PcdShellPrintBufferSize), L"%9", L"\"\"", FALSE, FALSE); Status = ShellCopySearchAndReplace(CommandLine2, CommandLine, PrintBuffSize, L"%9", L"\"\"", FALSE, FALSE);
StrCpyS( CommandLine2, StrnCpyS( CommandLine2,
PcdGet16(PcdShellPrintBufferSize)/sizeof(CHAR16), PrintBuffSize/sizeof(CHAR16),
CommandLine CommandLine,
PrintBuffSize/sizeof(CHAR16) - 1
); );
LastCommand = NewScriptFile->CurrentCommand; LastCommand = NewScriptFile->CurrentCommand;

View File

@ -261,7 +261,7 @@ GetNameFromHandle (
); );
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
SHELL_FREE_NON_NULL (PlatformLanguage); SHELL_FREE_NON_NULL (PlatformLanguage);
StrCpyS (mGaugeString, DP_GAUGE_STRING_LENGTH + 1, StringPtr); StrnCpyS (mGaugeString, DP_GAUGE_STRING_LENGTH + 1, StringPtr, DP_GAUGE_STRING_LENGTH);
mGaugeString[DP_GAUGE_STRING_LENGTH] = 0; mGaugeString[DP_GAUGE_STRING_LENGTH] = 0;
return; return;
} }
@ -305,7 +305,7 @@ GetNameFromHandle (
// //
// Method 3. Get the name string from FFS UI section // Method 3. Get the name string from FFS UI section
// //
StrCpyS (mGaugeString, DP_GAUGE_STRING_LENGTH + 1, NameString); StrnCpyS (mGaugeString, DP_GAUGE_STRING_LENGTH + 1, NameString, DP_GAUGE_STRING_LENGTH);
mGaugeString[DP_GAUGE_STRING_LENGTH] = 0; mGaugeString[DP_GAUGE_STRING_LENGTH] = 0;
FreePool (NameString); FreePool (NameString);
} else { } else {
@ -321,7 +321,7 @@ GetNameFromHandle (
// //
NameString = ConvertDevicePathToText (LoadedImageDevicePath, TRUE, FALSE); NameString = ConvertDevicePathToText (LoadedImageDevicePath, TRUE, FALSE);
if (NameString != NULL) { if (NameString != NULL) {
StrCpyS (mGaugeString, DP_GAUGE_STRING_LENGTH + 1, NameString); StrnCpyS (mGaugeString, DP_GAUGE_STRING_LENGTH + 1, NameString, DP_GAUGE_STRING_LENGTH);
mGaugeString[DP_GAUGE_STRING_LENGTH] = 0; mGaugeString[DP_GAUGE_STRING_LENGTH] = 0;
FreePool (NameString); FreePool (NameString);
return; return;
@ -334,7 +334,7 @@ GetNameFromHandle (
// //
StringPtr = HiiGetString (gDpHiiHandle, STRING_TOKEN (STR_DP_ERROR_NAME), NULL); StringPtr = HiiGetString (gDpHiiHandle, STRING_TOKEN (STR_DP_ERROR_NAME), NULL);
ASSERT (StringPtr != NULL); ASSERT (StringPtr != NULL);
StrCpyS (mGaugeString, DP_GAUGE_STRING_LENGTH + 1, StringPtr); StrnCpyS (mGaugeString, DP_GAUGE_STRING_LENGTH + 1, StringPtr, DP_GAUGE_STRING_LENGTH);
FreePool (StringPtr); FreePool (StringPtr);
} }

View File

@ -406,7 +406,7 @@ CascadeProcessVariables (
FoundVarName = AllocateZeroPool (NameSize); FoundVarName = AllocateZeroPool (NameSize);
if (FoundVarName != NULL) { if (FoundVarName != NULL) {
if (PrevName != NULL) { if (PrevName != NULL) {
StrCpyS(FoundVarName, NameSize/sizeof(CHAR16), PrevName); StrnCpyS(FoundVarName, NameSize/sizeof(CHAR16), PrevName, NameSize/sizeof(CHAR16) - 1);
} }
Status = gRT->GetNextVariableName (&NameSize, FoundVarName, &FoundVarGuid); Status = gRT->GetNextVariableName (&NameSize, FoundVarName, &FoundVarGuid);

View File

@ -3229,8 +3229,8 @@ QueryTable (
// //
if ((High > Low && Key >= Low && Key <= High) if ((High > Low && Key >= Low && Key <= High)
|| (Table[Index].Key == Key)) { || (Table[Index].Key == Key)) {
StrCpyS (Info, InfoLen, Table[Index].Info); StrnCpyS (Info, InfoLen, Table[Index].Info, InfoLen - 1);
StrCatS (Info, InfoLen, L"\n"); StrnCatS (Info, InfoLen, L"\n", InfoLen - 1 - StrLen(Info));
return Key; return Key;
} }
} }