diff options
author | hjk <qthjk@ovi.com> | 2012-08-15 13:54:59 +0200 |
---|---|---|
committer | hjk <qthjk@ovi.com> | 2012-08-15 14:05:49 +0200 |
commit | 33f930e986d71c3c3646fc1d915032ad7bbb4977 (patch) | |
tree | ba5c713e8d2e83a6cf4c543cdbcfb1e131f8917b /src/libs/utils/elfreader.cpp | |
parent | 4a2787df73d6089b72521e9ec8a77a1a93c187f4 (diff) |
elfreader: prevent out-of-bound reads when reading core file names
Change-Id: I2d1c2328d924acc8d1a8043625ad178b1c46ee6b
Reviewed-by: hjk <qthjk@ovi.com>
Diffstat (limited to 'src/libs/utils/elfreader.cpp')
-rw-r--r-- | src/libs/utils/elfreader.cpp | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/libs/utils/elfreader.cpp b/src/libs/utils/elfreader.cpp index 6bcdeda6f5b..be3c8c7fcce 100644 --- a/src/libs/utils/elfreader.cpp +++ b/src/libs/utils/elfreader.cpp @@ -327,6 +327,15 @@ QByteArray ElfReader::readSection(const QByteArray &name) return QByteArray(mapper.start + section.offset, section.size); } +static QByteArray cutout(const char *s) +{ + QByteArray res(s, 80); + const int pos = res.indexOf('\0'); + if (pos != -1) + res.resize(pos - 1); + return res; +} + QByteArray ElfReader::readCoreName(bool *isCore) { *isCore = false; @@ -345,15 +354,13 @@ QByteArray ElfReader::readCoreName(bool *isCore) for (int i = 0, n = m_elfData.sectionHeaders.size(); i != n; ++i) if (m_elfData.sectionHeaders.at(i).type == Elf_SHT_NOTE) { const ElfSectionHeader &header = m_elfData.sectionHeaders.at(i); - const char *s = mapper.start + header.offset + 0x40; - return QByteArray(s); + return cutout(mapper.start + header.offset + 0x40); } for (int i = 0, n = m_elfData.programHeaders.size(); i != n; ++i) if (m_elfData.programHeaders.at(i).type == Elf_PT_NOTE) { const ElfProgramHeader &header = m_elfData.programHeaders.at(i); - const char *s = mapper.start + header.offset + 0xec; - return QByteArray(s); + return cutout(mapper.start + header.offset + 0xec); } return QByteArray(); |