forked from OSchip/llvm-project
[ELF] - fix possible UB when dereferencing null
In InputSection.cpp it was possible to dereference null. Had to change signature of relocateTlsOptimize to accept pointer instead of reference. Differential revision: http://reviews.llvm.org/D16466 llvm-svn: 258508
This commit is contained in:
parent
c96da8faa6
commit
237b218770
|
@ -180,7 +180,7 @@ void InputSectionBase<ELFT>::relocate(uint8_t *Buf, uint8_t *BufEnd,
|
||||||
// relocations that immediately follow TLS relocations. This function
|
// relocations that immediately follow TLS relocations. This function
|
||||||
// knows how many slots we need to skip.
|
// knows how many slots we need to skip.
|
||||||
I += Target->relocateTlsOptimize(BufLoc, BufEnd, Type, AddrLoc, SymVA,
|
I += Target->relocateTlsOptimize(BufLoc, BufEnd, Type, AddrLoc, SymVA,
|
||||||
*Body);
|
Body);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -105,7 +105,7 @@ public:
|
||||||
bool isTlsOptimized(unsigned Type, const SymbolBody *S) const override;
|
bool isTlsOptimized(unsigned Type, const SymbolBody *S) const override;
|
||||||
unsigned relocateTlsOptimize(uint8_t *Loc, uint8_t *BufEnd, uint32_t Type,
|
unsigned relocateTlsOptimize(uint8_t *Loc, uint8_t *BufEnd, uint32_t Type,
|
||||||
uint64_t P, uint64_t SA,
|
uint64_t P, uint64_t SA,
|
||||||
const SymbolBody &S) const override;
|
const SymbolBody *S) const override;
|
||||||
bool isGotRelative(uint32_t Type) const override;
|
bool isGotRelative(uint32_t Type) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -141,7 +141,7 @@ public:
|
||||||
bool isSizeReloc(uint32_t Type) const override;
|
bool isSizeReloc(uint32_t Type) const override;
|
||||||
unsigned relocateTlsOptimize(uint8_t *Loc, uint8_t *BufEnd, uint32_t Type,
|
unsigned relocateTlsOptimize(uint8_t *Loc, uint8_t *BufEnd, uint32_t Type,
|
||||||
uint64_t P, uint64_t SA,
|
uint64_t P, uint64_t SA,
|
||||||
const SymbolBody &S) const override;
|
const SymbolBody *S) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void relocateTlsLdToLe(uint8_t *Loc, uint8_t *BufEnd, uint64_t P,
|
void relocateTlsLdToLe(uint8_t *Loc, uint8_t *BufEnd, uint64_t P,
|
||||||
|
@ -294,7 +294,7 @@ bool TargetInfo::isSizeReloc(uint32_t Type) const { return false; }
|
||||||
|
|
||||||
unsigned TargetInfo::relocateTlsOptimize(uint8_t *Loc, uint8_t *BufEnd,
|
unsigned TargetInfo::relocateTlsOptimize(uint8_t *Loc, uint8_t *BufEnd,
|
||||||
uint32_t Type, uint64_t P, uint64_t SA,
|
uint32_t Type, uint64_t P, uint64_t SA,
|
||||||
const SymbolBody &S) const {
|
const SymbolBody *S) const {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -483,10 +483,10 @@ bool X86TargetInfo::relocNeedsDynRelative(unsigned Type) const {
|
||||||
unsigned X86TargetInfo::relocateTlsOptimize(uint8_t *Loc, uint8_t *BufEnd,
|
unsigned X86TargetInfo::relocateTlsOptimize(uint8_t *Loc, uint8_t *BufEnd,
|
||||||
uint32_t Type, uint64_t P,
|
uint32_t Type, uint64_t P,
|
||||||
uint64_t SA,
|
uint64_t SA,
|
||||||
const SymbolBody &S) const {
|
const SymbolBody *S) const {
|
||||||
switch (Type) {
|
switch (Type) {
|
||||||
case R_386_TLS_GD:
|
case R_386_TLS_GD:
|
||||||
if (canBePreempted(&S, true))
|
if (canBePreempted(S, true))
|
||||||
relocateTlsGdToIe(Loc, BufEnd, P, SA);
|
relocateTlsGdToIe(Loc, BufEnd, P, SA);
|
||||||
else
|
else
|
||||||
relocateTlsGdToLe(Loc, BufEnd, P, SA);
|
relocateTlsGdToLe(Loc, BufEnd, P, SA);
|
||||||
|
@ -858,7 +858,7 @@ void X86_64TargetInfo::relocateTlsIeToLe(uint8_t *Loc, uint8_t *BufEnd,
|
||||||
unsigned X86_64TargetInfo::relocateTlsOptimize(uint8_t *Loc, uint8_t *BufEnd,
|
unsigned X86_64TargetInfo::relocateTlsOptimize(uint8_t *Loc, uint8_t *BufEnd,
|
||||||
uint32_t Type, uint64_t P,
|
uint32_t Type, uint64_t P,
|
||||||
uint64_t SA,
|
uint64_t SA,
|
||||||
const SymbolBody &S) const {
|
const SymbolBody *S) const {
|
||||||
switch (Type) {
|
switch (Type) {
|
||||||
case R_X86_64_DTPOFF32:
|
case R_X86_64_DTPOFF32:
|
||||||
relocateOne(Loc, BufEnd, R_X86_64_TPOFF32, P, SA);
|
relocateOne(Loc, BufEnd, R_X86_64_TPOFF32, P, SA);
|
||||||
|
@ -867,7 +867,7 @@ unsigned X86_64TargetInfo::relocateTlsOptimize(uint8_t *Loc, uint8_t *BufEnd,
|
||||||
relocateTlsIeToLe(Loc, BufEnd, P, SA);
|
relocateTlsIeToLe(Loc, BufEnd, P, SA);
|
||||||
return 0;
|
return 0;
|
||||||
case R_X86_64_TLSGD: {
|
case R_X86_64_TLSGD: {
|
||||||
if (canBePreempted(&S, true))
|
if (canBePreempted(S, true))
|
||||||
relocateTlsGdToIe(Loc, BufEnd, P, SA);
|
relocateTlsGdToIe(Loc, BufEnd, P, SA);
|
||||||
else
|
else
|
||||||
relocateTlsGdToLe(Loc, BufEnd, P, SA);
|
relocateTlsGdToLe(Loc, BufEnd, P, SA);
|
||||||
|
|
|
@ -81,7 +81,7 @@ public:
|
||||||
virtual bool needsCopyRel(uint32_t Type, const SymbolBody &S) const;
|
virtual bool needsCopyRel(uint32_t Type, const SymbolBody &S) const;
|
||||||
virtual unsigned relocateTlsOptimize(uint8_t *Loc, uint8_t *BufEnd,
|
virtual unsigned relocateTlsOptimize(uint8_t *Loc, uint8_t *BufEnd,
|
||||||
uint32_t Type, uint64_t P, uint64_t SA,
|
uint32_t Type, uint64_t P, uint64_t SA,
|
||||||
const SymbolBody &S) const;
|
const SymbolBody *S) const;
|
||||||
virtual ~TargetInfo();
|
virtual ~TargetInfo();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
Loading…
Reference in New Issue