Add safe checks around use of QImageReader (#3736)
Co-authored-by: pajlada <rasmus.karlsson@pajlada.com>
This commit is contained in:
+23
-9
@@ -138,14 +138,6 @@ namespace detail {
|
|||||||
{
|
{
|
||||||
QVector<Frame<QImage>> frames;
|
QVector<Frame<QImage>> frames;
|
||||||
|
|
||||||
if (reader.imageCount() == 0)
|
|
||||||
{
|
|
||||||
qCDebug(chatterinoImage)
|
|
||||||
<< "Error while reading image" << url.string << ": '"
|
|
||||||
<< reader.errorString() << "'";
|
|
||||||
return frames;
|
|
||||||
}
|
|
||||||
|
|
||||||
QImage image;
|
QImage image;
|
||||||
for (int index = 0; index < reader.imageCount(); ++index)
|
for (int index = 0; index < reader.imageCount(); ++index)
|
||||||
{
|
{
|
||||||
@@ -413,8 +405,30 @@ void Image::actuallyLoad()
|
|||||||
buffer.open(QIODevice::ReadOnly);
|
buffer.open(QIODevice::ReadOnly);
|
||||||
QImageReader reader(&buffer);
|
QImageReader reader(&buffer);
|
||||||
|
|
||||||
|
if (!reader.canRead())
|
||||||
|
{
|
||||||
|
qCDebug(chatterinoImage)
|
||||||
|
<< "Error: image cant be read " << shared->url().string;
|
||||||
|
return Failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto size = reader.size();
|
||||||
|
if (size.isEmpty())
|
||||||
|
{
|
||||||
|
return Failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns 1 for non-animated formats
|
||||||
|
if (reader.imageCount() <= 0)
|
||||||
|
{
|
||||||
|
qCDebug(chatterinoImage)
|
||||||
|
<< "Error: image has less than 1 frame "
|
||||||
|
<< shared->url().string << ": " << reader.errorString();
|
||||||
|
return Failure;
|
||||||
|
}
|
||||||
|
|
||||||
// use "double" to prevent int overflows
|
// use "double" to prevent int overflows
|
||||||
if (double(reader.size().width()) * double(reader.size().height()) *
|
if (double(size.width()) * double(size.height()) *
|
||||||
double(reader.imageCount()) * 4.0 >
|
double(reader.imageCount()) * 4.0 >
|
||||||
double(Image::maxBytesRam))
|
double(Image::maxBytesRam))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -14,7 +14,6 @@
|
|||||||
#include "util/FormatTime.hpp"
|
#include "util/FormatTime.hpp"
|
||||||
|
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
#include <QImageReader>
|
|
||||||
|
|
||||||
namespace chatterino {
|
namespace chatterino {
|
||||||
|
|
||||||
|
|||||||
@@ -204,8 +204,18 @@ void TwitchBadges::loadEmoteImage(const QString &name, ImagePtr image,
|
|||||||
buffer.open(QIODevice::ReadOnly);
|
buffer.open(QIODevice::ReadOnly);
|
||||||
QImageReader reader(&buffer);
|
QImageReader reader(&buffer);
|
||||||
|
|
||||||
QImage image;
|
if (!reader.canRead() || reader.size().isEmpty())
|
||||||
if (reader.imageCount() == 0 || !reader.read(&image))
|
{
|
||||||
|
return Failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
QImage image = reader.read();
|
||||||
|
if (image.isNull())
|
||||||
|
{
|
||||||
|
return Failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reader.imageCount() <= 0)
|
||||||
{
|
{
|
||||||
return Failure;
|
return Failure;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user