diff --git a/src/native/external/libunwind-version.txt b/src/native/external/libunwind-version.txt index f7064e3c6e1fe7..4a989653b3f204 100644 --- a/src/native/external/libunwind-version.txt +++ b/src/native/external/libunwind-version.txt @@ -6,3 +6,4 @@ Apply https://github.com/libunwind/libunwind/pull/701 Apply https://github.com/libunwind/libunwind/pull/703 Apply https://github.com/libunwind/libunwind/pull/704 Revert https://github.com/libunwind/libunwind/pull/503 # issue: https://github.com/libunwind/libunwind/issues/702 +Apply https://github.com/libunwind/libunwind/pull/714 diff --git a/src/native/external/libunwind/src/dwarf/Gget_proc_info_in_range.c b/src/native/external/libunwind/src/dwarf/Gget_proc_info_in_range.c index 5701c5d2d4ddf4..8a08520ee4545f 100644 --- a/src/native/external/libunwind/src/dwarf/Gget_proc_info_in_range.c +++ b/src/native/external/libunwind/src/dwarf/Gget_proc_info_in_range.c @@ -58,13 +58,17 @@ unw_get_proc_info_in_range (unw_word_t start_ip, if (eh_frame_table != 0) { unw_accessors_t *a = unw_get_accessors_int (as); - struct dwarf_eh_frame_hdr* exhdr = NULL; - if ((*a->access_mem)(as, eh_frame_table, (unw_word_t*)&exhdr, 0, arg) < 0) { + unw_word_t data; + if ((*a->access_mem)(as, eh_frame_table, &data, 0, arg) < 0) { return -UNW_EINVAL; } + /* we are reading only the first 4 `char` members of `struct dwarf_eh_frame_hdr`, which + * are guaranteed to fit into the first `sizeof(unw_word_t)` bytes */ + struct dwarf_eh_frame_hdr exhdr; + memcpy(&exhdr, &data, sizeof(data)); - if (exhdr->version != DW_EH_VERSION) { - Debug (1, "Unexpected version %d\n", exhdr->version); + if (exhdr.version != DW_EH_VERSION) { + Debug (1, "Unexpected version %d\n", exhdr.version); return -UNW_EBADVERSION; } unw_word_t addr = eh_frame_table + offsetof(struct dwarf_eh_frame_hdr, eh_frame); @@ -72,12 +76,12 @@ unw_get_proc_info_in_range (unw_word_t start_ip, unw_word_t fde_count; /* read eh_frame_ptr */ - if ((ret = dwarf_read_encoded_pointer(as, a, &addr, exhdr->eh_frame_ptr_enc, pi, &eh_frame_start, arg)) < 0) { + if ((ret = dwarf_read_encoded_pointer(as, a, &addr, exhdr.eh_frame_ptr_enc, pi, &eh_frame_start, arg)) < 0) { return ret; } /* read fde_count */ - if ((ret = dwarf_read_encoded_pointer(as, a, &addr, exhdr->fde_count_enc, pi, &fde_count, arg)) < 0) { + if ((ret = dwarf_read_encoded_pointer(as, a, &addr, exhdr.fde_count_enc, pi, &fde_count, arg)) < 0) { return ret; } @@ -87,8 +91,8 @@ unw_get_proc_info_in_range (unw_word_t start_ip, return -UNW_ENOINFO; } - if (exhdr->table_enc != (DW_EH_PE_datarel | DW_EH_PE_sdata4)) { - Debug (1, "Table encoding not supported %x\n", exhdr->table_enc); + if (exhdr.table_enc != (DW_EH_PE_datarel | DW_EH_PE_sdata4)) { + Debug (1, "Table encoding not supported %x\n", exhdr.table_enc); return -UNW_EINVAL; } @@ -113,3 +117,4 @@ unw_get_proc_info_in_range (unw_word_t start_ip, } return UNW_ESUCCESS; } +