summaryrefslogtreecommitdiffstats
path: root/debuggerd
diff options
context:
space:
mode:
authorYabin Cui <yabinc@google.com>2015-04-14 10:27:54 -0700
committerYabin Cui <yabinc@google.com>2015-04-14 10:27:54 -0700
commit03dca28def9303467ec6f28d43e90d465b816475 (patch)
tree19b839d29ee0536cb2aa89c140bcc5b5510d043f /debuggerd
parente83d8a6900ee53942e5939656c3b6ae177d1f1d2 (diff)
downloadsystem_core-03dca28def9303467ec6f28d43e90d465b816475.zip
system_core-03dca28def9303467ec6f28d43e90d465b816475.tar.gz
system_core-03dca28def9303467ec6f28d43e90d465b816475.tar.bz2
Fix alignment when reading note segment.
ELF said that padding is present, if necessary, to ensure 4-byte alignment for the descriptor and next note entry, but such padding is not included in namesz and descsz. Change-Id: I7896783f3d9a787772d56c49905f52a493c9fba1
Diffstat (limited to 'debuggerd')
-rw-r--r--debuggerd/elf_utils.cpp6
1 files changed, 4 insertions, 2 deletions
diff --git a/debuggerd/elf_utils.cpp b/debuggerd/elf_utils.cpp
index 764b9db..5ea03e7 100644
--- a/debuggerd/elf_utils.cpp
+++ b/debuggerd/elf_utils.cpp
@@ -29,6 +29,8 @@
#include "elf_utils.h"
+#define NOTE_ALIGN(size) ((size + 3) & ~3)
+
template <typename HdrType, typename PhdrType, typename NhdrType>
static bool get_build_id(
Backtrace* backtrace, uintptr_t base_addr, uint8_t* e_ident, std::string* build_id) {
@@ -60,7 +62,7 @@ static bool get_build_id(
addr += sizeof(nhdr);
if (nhdr.n_type == NT_GNU_BUILD_ID) {
// Skip the name (which is the owner and should be "GNU").
- addr += nhdr.n_namesz;
+ addr += NOTE_ALIGN(nhdr.n_namesz);
uint8_t build_id_data[128];
if (nhdr.n_namesz > sizeof(build_id_data)) {
ALOGE("Possible corrupted note, name size value is too large: %u",
@@ -80,7 +82,7 @@ static bool get_build_id(
} else {
// Move past the extra note data.
hdr_size -= sizeof(nhdr);
- size_t skip_bytes = nhdr.n_namesz + nhdr.n_descsz;
+ size_t skip_bytes = NOTE_ALIGN(nhdr.n_namesz) + NOTE_ALIGN(nhdr.n_descsz);
addr += skip_bytes;
if (hdr_size < skip_bytes) {
break;