segments.py: fix TLS checks in section_in_segment() (#275)
authorAndreas Ziegler <andreas.ziegler@fau.de>
Tue, 4 Feb 2020 13:30:09 +0000 (14:30 +0100)
committerGitHub <noreply@github.com>
Tue, 4 Feb 2020 13:30:09 +0000 (05:30 -0800)
commit765e7ea59608e994a92f26ed11cfa4a432b31108
treefc557071c705ee976ebc0e0e0f718b694e6d189f
parent9f5a73b5032ff6b8a03b9e57cc3527b4dcfdf6be
segments.py: fix TLS checks in section_in_segment() (#275)

While the comment in section_in_segment() suggests that the
logic follows the logic inside ELF_SECTION_IN_SEGMENT_1 with
the strict parameter set, all of the checks in the binutils
macro are written so that they must succeed for the section
to be contained in the current segment. In our implementation,
however, the checks were not properly negated.

This showed in the case of .tdata and .tbss which did not
appear in the section to segment mapping (these sections are
found in glibc, for example).

Fix it up by aligning the logic more closely to the binutils
macro by implementing the same logic and returning False only
if the checks fail. Additionally, introduce the third check
from the upstream binutils which checks the combination of
SHT_ALLOC sections and PT_LOAD-like segments.

Furthermore, in the original check, the PT_GNU_RELRO type was
misspelled with a 0 (zero) instead of an O so this check
could never have worked.

Fixes: #263
elftools/elf/segments.py