aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/utils/elfreader.cpp
diff options
context:
space:
mode:
authorhjk <qthjk@ovi.com>2012-08-15 13:54:59 +0200
committerhjk <qthjk@ovi.com>2012-08-15 14:05:49 +0200
commit33f930e986d71c3c3646fc1d915032ad7bbb4977 (patch)
treeba5c713e8d2e83a6cf4c543cdbcfb1e131f8917b /src/libs/utils/elfreader.cpp
parent4a2787df73d6089b72521e9ec8a77a1a93c187f4 (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.cpp15
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();