diff options
author | Christopher Ferris <cferris@google.com> | 2019-04-03 14:14:30 -0700 |
---|---|---|
committer | Christopher Ferris <cferris@google.com> | 2019-04-03 14:51:51 -0700 |
commit | 1760b45709df4d925c3a131db0b443b585837703 (patch) | |
tree | 47319f0150088a01beddc3fe3b5eb5a3638e2b7f /libunwindstack/tests/ElfInterfaceTest.cpp | |
parent | 25d42eeaa6ace4fc57be6580dfcf45c4785fdb6f (diff) |
Fix off by one reading build id.
Update unit tests and add new build id displaying in offline unwinds.
Bug: 129873279
Test: All unit tests pass.
Test: Verify that debuggerd displays build id properly.
Change-Id: I97f4a204842447a20c812f535a458155b937d5e1
Diffstat (limited to 'libunwindstack/tests/ElfInterfaceTest.cpp')
-rw-r--r-- | libunwindstack/tests/ElfInterfaceTest.cpp | 47 |
1 files changed, 29 insertions, 18 deletions
diff --git a/libunwindstack/tests/ElfInterfaceTest.cpp b/libunwindstack/tests/ElfInterfaceTest.cpp index d895863bb..cdc927aba 100644 --- a/libunwindstack/tests/ElfInterfaceTest.cpp +++ b/libunwindstack/tests/ElfInterfaceTest.cpp @@ -1192,14 +1192,16 @@ void ElfInterfaceTest::BuildID() { char note_section[128]; Nhdr note_header = {}; note_header.n_namesz = 4; // "GNU" - note_header.n_descsz = 8; // "BUILDID" + note_header.n_descsz = 7; // "BUILDID" note_header.n_type = NT_GNU_BUILD_ID; memcpy(¬e_section, ¬e_header, sizeof(note_header)); size_t note_offset = sizeof(note_header); + // The note information contains the GNU and trailing '\0'. memcpy(¬e_section[note_offset], "GNU", sizeof("GNU")); note_offset += sizeof("GNU"); - memcpy(¬e_section[note_offset], "BUILDID", sizeof("BUILDID")); - note_offset += sizeof("BUILDID"); + // This part of the note does not contain any trailing '\0'. + memcpy(¬e_section[note_offset], "BUILDID", 7); + note_offset += 8; Shdr shdr = {}; shdr.sh_type = SHT_NOTE; @@ -1244,24 +1246,27 @@ void ElfInterfaceTest::BuildIDTwoNotes() { char note_section[128]; Nhdr note_header = {}; note_header.n_namesz = 8; // "WRONG" aligned to 4 - note_header.n_descsz = 8; // "BUILDID" + note_header.n_descsz = 7; // "BUILDID" note_header.n_type = NT_GNU_BUILD_ID; memcpy(¬e_section, ¬e_header, sizeof(note_header)); size_t note_offset = sizeof(note_header); memcpy(¬e_section[note_offset], "WRONG", sizeof("WRONG")); note_offset += 8; - memcpy(¬e_section[note_offset], "BUILDID", sizeof("BUILDID")); - note_offset += sizeof("BUILDID"); + // This part of the note does not contain any trailing '\0'. + memcpy(¬e_section[note_offset], "BUILDID", 7); + note_offset += 8; note_header.n_namesz = 4; // "GNU" - note_header.n_descsz = 8; // "BUILDID" + note_header.n_descsz = 7; // "BUILDID" note_header.n_type = NT_GNU_BUILD_ID; memcpy(¬e_section[note_offset], ¬e_header, sizeof(note_header)); note_offset += sizeof(note_header); + // The note information contains the GNU and trailing '\0'. memcpy(¬e_section[note_offset], "GNU", sizeof("GNU")); note_offset += sizeof("GNU"); - memcpy(¬e_section[note_offset], "BUILDID", sizeof("BUILDID")); - note_offset += sizeof("BUILDID"); + // This part of the note does not contain any trailing '\0'. + memcpy(¬e_section[note_offset], "BUILDID", 7); + note_offset += 8; Shdr shdr = {}; shdr.sh_type = SHT_NOTE; @@ -1306,14 +1311,16 @@ void ElfInterfaceTest::BuildIDSectionTooSmallForName () { char note_section[128]; Nhdr note_header = {}; note_header.n_namesz = 4; // "GNU" - note_header.n_descsz = 8; // "BUILDID" + note_header.n_descsz = 7; // "BUILDID" note_header.n_type = NT_GNU_BUILD_ID; memcpy(¬e_section, ¬e_header, sizeof(note_header)); size_t note_offset = sizeof(note_header); + // The note information contains the GNU and trailing '\0'. memcpy(¬e_section[note_offset], "GNU", sizeof("GNU")); note_offset += sizeof("GNU"); - memcpy(¬e_section[note_offset], "BUILDID", sizeof("BUILDID")); - note_offset += sizeof("BUILDID"); + // This part of the note does not contain any trailing '\0'. + memcpy(¬e_section[note_offset], "BUILDID", 7); + note_offset += 8; Shdr shdr = {}; shdr.sh_type = SHT_NOTE; @@ -1358,14 +1365,16 @@ void ElfInterfaceTest::BuildIDSectionTooSmallForDesc () { char note_section[128]; Nhdr note_header = {}; note_header.n_namesz = 4; // "GNU" - note_header.n_descsz = 8; // "BUILDID" + note_header.n_descsz = 7; // "BUILDID" note_header.n_type = NT_GNU_BUILD_ID; memcpy(¬e_section, ¬e_header, sizeof(note_header)); size_t note_offset = sizeof(note_header); + // The note information contains the GNU and trailing '\0'. memcpy(¬e_section[note_offset], "GNU", sizeof("GNU")); note_offset += sizeof("GNU"); - memcpy(¬e_section[note_offset], "BUILDID", sizeof("BUILDID")); - note_offset += sizeof("BUILDID"); + // This part of the note does not contain any trailing '\0'. + memcpy(¬e_section[note_offset], "BUILDID", 7); + note_offset += 8; Shdr shdr = {}; shdr.sh_type = SHT_NOTE; @@ -1410,14 +1419,16 @@ void ElfInterfaceTest::BuildIDSectionTooSmallForHeader () { char note_section[128]; Nhdr note_header = {}; note_header.n_namesz = 4; // "GNU" - note_header.n_descsz = 8; // "BUILDID" + note_header.n_descsz = 7; // "BUILDID" note_header.n_type = NT_GNU_BUILD_ID; memcpy(¬e_section, ¬e_header, sizeof(note_header)); size_t note_offset = sizeof(note_header); + // The note information contains the GNU and trailing '\0'. memcpy(¬e_section[note_offset], "GNU", sizeof("GNU")); note_offset += sizeof("GNU"); - memcpy(¬e_section[note_offset], "BUILDID", sizeof("BUILDID")); - note_offset += sizeof("BUILDID"); + // This part of the note does not contain any trailing '\0'. + memcpy(¬e_section[note_offset], "BUILDID", 7); + note_offset += 8; Shdr shdr = {}; shdr.sh_type = SHT_NOTE; |