BaseTools/GenFw: Correct datatypes in diagnostic messages and check for string termination

This patch revises multiple diagnostic messages to use correct
datatypes.  It also checks that a symbol name that is about to be used
in a diagnostic message is terminated by a null character within the
contents of the string table section so that the print routine does
not read past the end of the string table section contents when
reading the symbol name.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Michael LeMay <michael.lemay@intel.com>
Reviewed-by: Yonghong Zhu <yonghong.zhu@intel.com>
This commit is contained in:
Michael LeMay 2016-01-29 09:53:47 -08:00 committed by Yonghong Zhu
parent 621bb723a4
commit ea3e924a0c
2 changed files with 24 additions and 6 deletions

View File

@ -21,6 +21,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#include <io.h> #include <io.h>
#endif #endif
#include <assert.h> #include <assert.h>
#include <stdbool.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
@ -310,7 +311,15 @@ GetSymName (
assert(Sym->st_name < StrtabShdr->sh_size); assert(Sym->st_name < StrtabShdr->sh_size);
return (UINT8*)mEhdr + StrtabShdr->sh_offset + Sym->st_name; UINT8* StrtabContents = (UINT8*)mEhdr + StrtabShdr->sh_offset;
bool foundEnd = false;
for (UINT32 i = Sym->st_name; (i < StrtabShdr->sh_size) && !foundEnd; i++) {
foundEnd = StrtabContents[i] == 0;
}
assert(foundEnd);
return StrtabContents + Sym->st_name;
} }
// //
@ -539,7 +548,7 @@ ScanSections32 (
NtHdr->Pe32.OptionalHeader.Magic = EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC; NtHdr->Pe32.OptionalHeader.Magic = EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC;
break; break;
default: default:
VerboseMsg ("%s unknown e_machine type. Assume IA-32", (UINTN)mEhdr->e_machine); VerboseMsg ("%s unknown e_machine type %hu. Assume IA-32", mInImageName, mEhdr->e_machine);
NtHdr->Pe32.FileHeader.Machine = EFI_IMAGE_MACHINE_IA32; NtHdr->Pe32.FileHeader.Machine = EFI_IMAGE_MACHINE_IA32;
NtHdr->Pe32.OptionalHeader.Magic = EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC; NtHdr->Pe32.OptionalHeader.Magic = EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC;
} }
@ -725,7 +734,7 @@ WriteSections32 (
} }
Error (NULL, 0, 3000, "Invalid", Error (NULL, 0, 3000, "Invalid",
"%s: Bad definition for symbol '%s'@%p or unsupported symbol type. " "%s: Bad definition for symbol '%s'@%#x or unsupported symbol type. "
"For example, absolute and undefined symbols are not supported.", "For example, absolute and undefined symbols are not supported.",
mInImageName, SymName, Sym->st_value); mInImageName, SymName, Sym->st_value);

View File

@ -21,6 +21,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#include <io.h> #include <io.h>
#endif #endif
#include <assert.h> #include <assert.h>
#include <stdbool.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
@ -302,7 +303,15 @@ GetSymName (
assert(Sym->st_name < StrtabShdr->sh_size); assert(Sym->st_name < StrtabShdr->sh_size);
return (UINT8*)mEhdr + StrtabShdr->sh_offset + Sym->st_name; UINT8* StrtabContents = (UINT8*)mEhdr + StrtabShdr->sh_offset;
bool foundEnd = false;
for (UINT32 i = Sym->st_name; (i < StrtabShdr->sh_size) && !foundEnd; i++) {
foundEnd = StrtabContents[i] == 0;
}
assert(foundEnd);
return StrtabContents + Sym->st_name;
} }
// //
@ -337,7 +346,7 @@ ScanSections64 (
mCoffOffset += sizeof (EFI_IMAGE_NT_HEADERS64); mCoffOffset += sizeof (EFI_IMAGE_NT_HEADERS64);
break; break;
default: default:
VerboseMsg ("%s unknown e_machine type. Assume X64", (UINTN)mEhdr->e_machine); VerboseMsg ("%s unknown e_machine type %hu. Assume X64", mInImageName, mEhdr->e_machine);
mCoffOffset += sizeof (EFI_IMAGE_NT_HEADERS64); mCoffOffset += sizeof (EFI_IMAGE_NT_HEADERS64);
break; break;
} }
@ -721,7 +730,7 @@ WriteSections64 (
} }
Error (NULL, 0, 3000, "Invalid", Error (NULL, 0, 3000, "Invalid",
"%s: Bad definition for symbol '%s'@%p or unsupported symbol type. " "%s: Bad definition for symbol '%s'@%#llx or unsupported symbol type. "
"For example, absolute and undefined symbols are not supported.", "For example, absolute and undefined symbols are not supported.",
mInImageName, SymName, Sym->st_value); mInImageName, SymName, Sym->st_value);