diff options
author | João Abecasis <joao.abecasis@nokia.com> | 2012-03-28 15:10:52 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-03-30 13:24:00 +0200 |
commit | 26d12ecd27d10cd7ca4515badfe39919a191fbf0 (patch) | |
tree | 5cea47abde5051f03b00b0d4ba5f7981110ff0cb /src/corelib/kernel/qtranslator.cpp | |
parent | 4ef5a6269c1465662ea3872596ba284a13cce25e (diff) |
Verify presence of "magic cookie" before more expensive reads
Moved this simple sanitation out of do_load as it will prevent us from
loading misplaced (or misfound) files into memory in the first place.
We'll still load anything minimally looking like a translation file.
Change-Id: Ia138be010979d4a66d330f7414fce3df20727e68
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
Diffstat (limited to 'src/corelib/kernel/qtranslator.cpp')
-rw-r--r-- | src/corelib/kernel/qtranslator.cpp | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/src/corelib/kernel/qtranslator.cpp b/src/corelib/kernel/qtranslator.cpp index 0eafce6000..217f99e270 100644 --- a/src/corelib/kernel/qtranslator.cpp +++ b/src/corelib/kernel/qtranslator.cpp @@ -454,12 +454,20 @@ bool QTranslatorPrivate::do_load(const QString &realname) bool ok = false; QFile file(realname); - if (!file.open(QIODevice::ReadOnly)) + if (!file.open(QIODevice::ReadOnly | QIODevice::Unbuffered)) return false; qint64 fileSize = file.size(); - if (!fileSize || quint32(-1) <= fileSize) + if (fileSize <= MagicLength || quint32(-1) <= fileSize) return false; + + { + char magicBuffer[MagicLength]; + if (MagicLength != file.read(magicBuffer, MagicLength) + || memcmp(magicBuffer, magic, MagicLength)) + return false; + } + d->unmapLength = quint32(fileSize); #ifdef QT_USE_MMAP @@ -491,6 +499,7 @@ bool QTranslatorPrivate::do_load(const QString &realname) if (!ok) { d->unmapPointer = new char[d->unmapLength]; if (d->unmapPointer) { + file.seek(0); qint64 readResult = file.read(d->unmapPointer, d->unmapLength); if (readResult == qint64(unmapLength)) ok = true; @@ -670,6 +679,10 @@ bool QTranslator::load(const uchar *data, int len) { Q_D(QTranslator); d->clear(); + + if (!data || len < MagicLength || memcmp(data, magic, MagicLength)) + return false; + return d->do_load(data, len); } @@ -690,9 +703,6 @@ static quint32 read32(const uchar *data) bool QTranslatorPrivate::do_load(const uchar *data, int len) { - if (!data || len < MagicLength || memcmp(data, magic, MagicLength)) - return false; - bool ok = true; const uchar *end = data + len; |