@@ -1000,29 +1000,31 @@ UUID ProcessElfCore::FindBuidIdInCoreMemory(lldb::addr_t address) {
1000
1000
const size_t elf_header_size = addr_size == 4 ? sizeof (llvm::ELF::Elf32_Ehdr)
1001
1001
: sizeof (llvm::ELF::Elf64_Ehdr);
1002
1002
1003
- // 80 bytes buffer is larger enough for the ELF header or program headers
1004
- unsigned char buf[ 80 ] ;
1003
+ std::vector< uint8_t > elf_header_bytes;
1004
+ elf_header_bytes. resize (elf_header_size) ;
1005
1005
Status error;
1006
- size_t byte_read = ReadMemory (address, buf, elf_header_size, error);
1007
- if (byte_read != elf_header_size || !elf::ELFHeader::MagicBytesMatch (buf))
1006
+ size_t byte_read =
1007
+ ReadMemory (address, elf_header_bytes.data (), elf_header_size, error);
1008
+ if (byte_read != elf_header_size ||
1009
+ !elf::ELFHeader::MagicBytesMatch (elf_header_bytes.data ()))
1008
1010
return invalid_uuid;
1009
- assert (sizeof (buf) >= elf_header_size);
1010
- DataExtractor elf_header_data (buf, elf_header_size, GetByteOrder (),
1011
- addr_size);
1011
+ DataExtractor elf_header_data (elf_header_bytes.data (), elf_header_size,
1012
+ GetByteOrder (), addr_size);
1012
1013
lldb::offset_t offset = 0 ;
1013
1014
1014
1015
elf::ELFHeader elf_header;
1015
1016
elf_header.Parse (elf_header_data, &offset);
1016
1017
1017
1018
const lldb::addr_t ph_addr = address + elf_header.e_phoff ;
1018
1019
1020
+ std::vector<uint8_t > ph_bytes;
1021
+ ph_bytes.resize (elf_header.e_phentsize );
1019
1022
for (unsigned int i = 0 ; i < elf_header.e_phnum ; ++i) {
1020
- byte_read = ReadMemory (ph_addr + i * elf_header.e_phentsize , buf,
1021
- elf_header.e_phentsize , error);
1023
+ byte_read = ReadMemory (ph_addr + i * elf_header.e_phentsize ,
1024
+ ph_bytes. data (), elf_header.e_phentsize , error);
1022
1025
if (byte_read != elf_header.e_phentsize )
1023
1026
break ;
1024
- assert (sizeof (buf) >= elf_header.e_phentsize );
1025
- DataExtractor program_header_data (buf, elf_header.e_phentsize ,
1027
+ DataExtractor program_header_data (ph_bytes.data (), elf_header.e_phentsize ,
1026
1028
GetByteOrder (), addr_size);
1027
1029
offset = 0 ;
1028
1030
elf::ELFProgramHeader program_header;
@@ -1037,19 +1039,17 @@ UUID ProcessElfCore::FindBuidIdInCoreMemory(lldb::addr_t address) {
1037
1039
program_header.p_memsz , error);
1038
1040
if (byte_read != program_header.p_memsz )
1039
1041
continue ;
1040
- assert (sizeof (buf) >= program_header.p_memsz );
1041
1042
DataExtractor segment_data (note_bytes.data (), note_bytes.size (),
1042
1043
GetByteOrder (), addr_size);
1043
1044
auto notes_or_error = parseSegment (segment_data);
1044
1045
if (!notes_or_error)
1045
1046
return invalid_uuid;
1046
1047
for (const CoreNote ¬e : *notes_or_error) {
1047
1048
if (note.info .n_namesz == 4 &&
1048
- note.info .n_type == llvm::ELF::NT_GNU_BUILD_ID) {
1049
- if (" GNU" == note.info .n_name )
1050
- return UUID (llvm::ArrayRef<uint8_t >(
1051
- note.data .GetDataStart (), note.info .n_descsz /* byte size*/ ));
1052
- }
1049
+ note.info .n_type == llvm::ELF::NT_GNU_BUILD_ID &&
1050
+ " GNU" == note.info .n_name &&
1051
+ note.data .ValidOffsetForDataOfSize (0 , note.info .n_descsz ))
1052
+ return UUID (note.data .GetData ().take_front (note.info .n_descsz ));
1053
1053
}
1054
1054
}
1055
1055
return invalid_uuid;
0 commit comments