summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2020-05-18 13:51:09 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2020-05-18 14:09:00 +0000
commit1a790ba6151a3128b49d3dc556d3373dbda9f9d1 (patch)
treea1defeeff05e2971abfe9ffaa740d654eecb4acd
parentec15f82b67b851d9dc789cc292c662a988100534 (diff)
downloadqtimageformats-1a790ba6151a3128b49d3dc556d3373dbda9f9d1.tar.gz
Fix UB in webp decode and memory leak in encoder
Ensure the ICC block is aligned before parsing and clear the writer after we have initialized it. Fixes: QTBUG-84267 Change-Id: I7e16ee7663dbe404b4819769deab7d9c9b6c8f20 Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io> (cherry picked from commit b761ff58d6d7b0604d88d6bd332b4470044ffe6a) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/plugins/imageformats/webp/qwebphandler.cpp9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/plugins/imageformats/webp/qwebphandler.cpp b/src/plugins/imageformats/webp/qwebphandler.cpp
index c1898d0..82d38cb 100644
--- a/src/plugins/imageformats/webp/qwebphandler.cpp
+++ b/src/plugins/imageformats/webp/qwebphandler.cpp
@@ -167,8 +167,11 @@ bool QWebpHandler::read(QImage *image)
// Read global meta-data chunks first
WebPChunkIterator metaDataIter;
if ((m_formatFlags & ICCP_FLAG) && WebPDemuxGetChunk(m_demuxer, "ICCP", 1, &metaDataIter)) {
- const QByteArray iccProfile = QByteArray::fromRawData(reinterpret_cast<const char *>(metaDataIter.chunk.bytes),
- metaDataIter.chunk.size);
+ QByteArray iccProfile = QByteArray::fromRawData(reinterpret_cast<const char *>(metaDataIter.chunk.bytes),
+ metaDataIter.chunk.size);
+ // Ensure the profile is 4-byte aligned.
+ if (reinterpret_cast<qintptr>(iccProfile.constData()) & 0x3)
+ iccProfile.detach();
m_colorSpace = QColorSpace::fromIccProfile(iccProfile);
// ### consider parsing EXIF and/or XMP metadata too.
WebPDemuxReleaseChunkIterator(&metaDataIter);
@@ -288,6 +291,7 @@ bool QWebpHandler::write(const QImage &image)
if (!WebPEncode(&config, &picture)) {
qWarning() << "failed to encode webp picture, error code: " << picture.error_code;
WebPPictureFree(&picture);
+ WebPMemoryWriterClear(&writer);
return false;
}
@@ -336,6 +340,7 @@ bool QWebpHandler::write(const QImage &image)
static_cast<size_t>(device()->write(reinterpret_cast<const char *>(writer.mem), writer.size)));
}
WebPPictureFree(&picture);
+ WebPMemoryWriterClear(&writer);
return res;
}