diff options
author | Brad King <brad.king@kitware.com> | 2008-03-01 12:50:42 -0500 |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2008-03-01 12:50:42 -0500 |
commit | 61178a0682a024e03e6fe41897b40bb096611f7a (patch) | |
tree | b24cd7f1444bde15663d462b858b69268b5af887 /Source/cmELF.cxx | |
parent | b2cf4db2010ae0c08cd063b7aa8136fd512d8a97 (diff) | |
download | cmake-61178a0682a024e03e6fe41897b40bb096611f7a.tar.gz |
ENH: Add Size member to cmELF::StringEntry to return the amount of space in the string entry.
Diffstat (limited to 'Source/cmELF.cxx')
-rw-r--r-- | Source/cmELF.cxx | 40 |
1 files changed, 33 insertions, 7 deletions
diff --git a/Source/cmELF.cxx b/Source/cmELF.cxx index 09a7e1739d..c6b078b079 100644 --- a/Source/cmELF.cxx +++ b/Source/cmELF.cxx @@ -488,6 +488,7 @@ cmELFInternalImpl<Types>::GetDynamicSectionString(int tag) // Create an entry for this tag. Assume it is missing until found. StringEntry& se = this->DynamicSectionStrings[tag]; se.Position = 0; + se.Size = 0; // Try reading the dynamic section. if(!this->LoadDynamicSection()) @@ -512,14 +513,39 @@ cmELFInternalImpl<Types>::GetDynamicSectionString(int tag) ELF_Dyn& dyn = *di; if(dyn.d_tag == tag) { - // Seek to the position reported by the entry. - this->Stream.seekg(strtab.sh_offset + dyn.d_un.d_val); + // We found the tag requested. + // Make sure the position given is within the string section. + if(dyn.d_un.d_val >= strtab.sh_size) + { + this->SetErrorMessage("Section DYNAMIC references string beyond " + "the end of its string section."); + return 0; + } - // Read the string. + // Seek to the position reported by the entry. + unsigned long first = static_cast<unsigned long>(dyn.d_un.d_val); + unsigned long last = first; + unsigned long end = static_cast<unsigned long>(strtab.sh_size); + this->Stream.seekg(strtab.sh_offset + first); + + // Read the string. It may be followed by more than one NULL + // terminator. Count the total size of the region allocated to + // the string. This assumes that the next string in the table + // is non-empty, but the "chrpath" tool makes the same + // assumption. + bool terminated = false; char c; - while(this->Stream.get(c) && c != 0) + while(last != end && this->Stream.get(c) && !(terminated && c)) { - se.Value += c; + ++last; + if(c) + { + se.Value += c; + } + else + { + terminated = true; + } } // Make sure the whole value was read. @@ -531,8 +557,8 @@ cmELFInternalImpl<Types>::GetDynamicSectionString(int tag) } // The value has been read successfully. Report it. - se.Position = - static_cast<unsigned long>(strtab.sh_offset + dyn.d_un.d_val); + se.Position = static_cast<unsigned long>(strtab.sh_offset + first); + se.Size = last - first; return &se; } } |