diff options
author | Kim Motoyoshi Kalland <kim.kalland@nokia.com> | 2011-07-19 15:53:25 (GMT) |
---|---|---|
committer | Kim Motoyoshi Kalland <kim.kalland@nokia.com> | 2011-07-20 08:21:01 (GMT) |
commit | c9d2445bc3bbccd3cc6cfb95f09108cabe981840 (patch) | |
tree | edc11ba5b0bdf4f21e9e4c337ce4456324c4014d /src | |
parent | 9ae6f2f9a57f0c3096d5785913e437953fa6775c (diff) | |
download | Qt-c9d2445bc3bbccd3cc6cfb95f09108cabe981840.zip Qt-c9d2445bc3bbccd3cc6cfb95f09108cabe981840.tar.gz Qt-c9d2445bc3bbccd3cc6cfb95f09108cabe981840.tar.bz2 |
Fixed crash when loading 16 bits-per-pixel grayscale TIFs.
Use the fallback path when encountering 16 bits-per-pixel
grayscale TIFs. Also fixed potential memory leak.
Task-number: QTBUG-19878
Reviewed-by: Samuel
Diffstat (limited to 'src')
-rw-r--r-- | src/gui/image/qtiffhandler.cpp | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/src/gui/image/qtiffhandler.cpp b/src/gui/image/qtiffhandler.cpp index 4a90e49..fd1c488 100644 --- a/src/gui/image/qtiffhandler.cpp +++ b/src/gui/image/qtiffhandler.cpp @@ -192,13 +192,19 @@ bool QTiffHandler::read(QImage *image) return false; } - // BitsPerSample defaults to 1 according to the TIFF spec. - uint16 bitPerSample; - if (!TIFFGetField(tiff, TIFFTAG_BITSPERSAMPLE, &bitPerSample)) - bitPerSample = 1; + uint16 bitsPerSample, samplesPerPixel, bitsPerPixel; + if (!TIFFGetFieldDefaulted(tiff, TIFFTAG_BITSPERSAMPLE, &bitsPerSample)) { + TIFFClose(tiff); + return false; + } + if (!TIFFGetFieldDefaulted(tiff, TIFFTAG_SAMPLESPERPIXEL, &samplesPerPixel)) { + TIFFClose(tiff); + return false; + } + bitsPerPixel = bitsPerSample * samplesPerPixel; bool grayscale = photometric == PHOTOMETRIC_MINISBLACK || photometric == PHOTOMETRIC_MINISWHITE; - if (grayscale && bitPerSample == 1) { + if (grayscale && bitsPerPixel == 1) { if (image->size() != QSize(width, height) || image->format() != QImage::Format_Mono) *image = QImage(width, height, QImage::Format_Mono); QVector<QRgb> colortable(2); @@ -220,7 +226,7 @@ bool QTiffHandler::read(QImage *image) } } } else { - if ((grayscale || photometric == PHOTOMETRIC_PALETTE) && bitPerSample == 8) { + if ((grayscale || photometric == PHOTOMETRIC_PALETTE) && bitsPerPixel == 8) { if (image->size() != QSize(width, height) || image->format() != QImage::Format_Indexed8) *image = QImage(width, height, QImage::Format_Indexed8); if (!image->isNull()) { @@ -233,14 +239,14 @@ bool QTiffHandler::read(QImage *image) } } else { // create the color table - uint16 *redTable = static_cast<uint16 *>(qMalloc(tableSize * sizeof(uint16))); - uint16 *greenTable = static_cast<uint16 *>(qMalloc(tableSize * sizeof(uint16))); - uint16 *blueTable = static_cast<uint16 *>(qMalloc(tableSize * sizeof(uint16))); - if (!redTable || !greenTable || !blueTable) { + uint16 *redTable = 0; + uint16 *greenTable = 0; + uint16 *blueTable = 0; + if (!TIFFGetField(tiff, TIFFTAG_COLORMAP, &redTable, &greenTable, &blueTable)) { TIFFClose(tiff); return false; } - if (!TIFFGetField(tiff, TIFFTAG_COLORMAP, &redTable, &greenTable, &blueTable)) { + if (!redTable || !greenTable || !blueTable) { TIFFClose(tiff); return false; } @@ -497,6 +503,9 @@ bool QTiffHandler::write(const QImage &image) uint16 *greenTable = static_cast<uint16 *>(qMalloc(256 * sizeof(uint16))); uint16 *blueTable = static_cast<uint16 *>(qMalloc(256 * sizeof(uint16))); if (!redTable || !greenTable || !blueTable) { + qFree(redTable); + qFree(greenTable); + qFree(blueTable); TIFFClose(tiff); return false; } |