Breakpad DWARF CFI parser: Use the proper type for offsets in CallFrameInfo::Rule subclasses.

The subclasses of CallFrameInfo::Rule store the rule currently in
force for recovering a register or computing the canonical frame
address. Their sole responsibility is to accurately convey rules from
the parser, which creates them, to a CallFrameInfo::Handler member
function, which consumes them. So, the types of their data members
should match those of the corresponding arguments of the corresponding
Handler member function.

CallFrameInfo::OffsetRule and CallFrameInfo::ValOffsetRule use an
'int' to store the rule's offset value, but
CallFrameInfo::Handler::OffsetRule and ...::ValOffsetRule expect a
'long'.  On ABIs where 'long' is larger than 'int', this can cause
values to be truncated or sign-extended unexpectedly.

This patch changes those members to 'long'.

Fortunately, offsets appearing in real DWARF call frame information
never even come close to the limits of a 32-bit int, so this bug is
unlikely to cause any practical problems.
A=jimb R=thestig

git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@615 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
ted.mielczarek 2010-06-25 16:56:48 +00:00
parent 1adc07f0ff
commit 6869f2e1b3

View file

@ -969,7 +969,7 @@ class CallFrameInfo::OffsetRule: public CallFrameInfo::Rule {
// computes the address at which a register is saved, not a value. // computes the address at which a register is saved, not a value.
private: private:
int base_register_; int base_register_;
int offset_; long offset_;
}; };
// Rule: the value the register had in the caller is the value of // Rule: the value the register had in the caller is the value of
@ -996,7 +996,7 @@ class CallFrameInfo::ValOffsetRule: public CallFrameInfo::Rule {
void SetOffset(long long offset) { offset_ = offset; } void SetOffset(long long offset) { offset_ = offset; }
private: private:
int base_register_; int base_register_;
int offset_; long offset_;
}; };
// Rule: the register has been saved in another register REGISTER_NUMBER_. // Rule: the register has been saved in another register REGISTER_NUMBER_.