From 26d9799be5e9aa873d4b3f2c527875c77c3b9aec Mon Sep 17 00:00:00 2001 From: aolo2 Date: Sun, 11 Jul 2021 16:29:00 +0300 Subject: [PATCH] Fix reading of >1 byte data in .debug_info --- dwarf.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/dwarf.c b/dwarf.c index ba2a671..b3034d3 100644 --- a/dwarf.c +++ b/dwarf.c @@ -187,7 +187,8 @@ find_subroutine_offset(u8 *file, u64 header_size, u8 address_size, switch (form) { case DW_FORM_sec_offset: case DW_FORM_strp: { - u32 data = file[data_offset]; + u32 data; + memcpy(&data, file + data_offset, 4); data_offset += 4; // 8 bytes for x64 DWARF! if (form == DW_FORM_strp) { @@ -232,7 +233,8 @@ find_subroutine_offset(u8 *file, u64 header_size, u8 address_size, } case DW_FORM_ref4: { - u32 data = file[data_offset]; + u32 data; + memcpy(&data, file + data_offset, 4); data_offset += 4; //printf("%#x\n", data); u32 referenced_data = file[original_data_offset - header_size + data]; @@ -262,21 +264,24 @@ find_subroutine_offset(u8 *file, u64 header_size, u8 address_size, }; case DW_FORM_data2: { - u16 data = file[data_offset]; + u16 data; + memcpy(&data, file + data_offset, 2); data_offset += 2; //printf("%#x\n", data); break; }; case DW_FORM_data4: { - u32 data = file[data_offset]; + u32 data; + memcpy(&data, file + data_offset, 4); data_offset += 4; //printf("%#x\n", data); break; }; case DW_FORM_data8: { - u64 data = file[data_offset]; + u64 data; + memcpy(&data, file + data_offset, 8); data_offset += 8; //printf("%#lx\n", data); break; @@ -284,7 +289,7 @@ find_subroutine_offset(u8 *file, u64 header_size, u8 address_size, default: { if (form) { - //printf("unknown attribute form %d\n", form); + printf("unknown attribute form %d\n", form); } } }