r23735 by jghali - Fix coverity 1463154: (Very unlikely) double free

scribus-commit scribus-commit at lists.scribus.net
Sun May 10 14:33:39 UTC 2020


Author: jghali
Date: Sun May 10 14:33:39 2020
New Revision: 23735

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=23735
Log:
Fix coverity 1463154: (Very unlikely) double free

Modified:
    trunk/Scribus/scribus/imagedataloaders/scimgdataloader_pgf.cpp

Modified: trunk/Scribus/scribus/imagedataloaders/scimgdataloader_pgf.cpp
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=23735&path=/trunk/Scribus/scribus/imagedataloaders/scimgdataloader_pgf.cpp
==============================================================================
--- trunk/Scribus/scribus/imagedataloaders/scimgdataloader_pgf.cpp	(original)
+++ trunk/Scribus/scribus/imagedataloaders/scimgdataloader_pgf.cpp	Sun May 10 14:33:39 2020
@@ -7,10 +7,12 @@
 
 #include "scconfig.h"
 
+#include <QByteArray>
 #include <QDebug>
 #include <QFile>
-#include <QByteArray>
 #include <QList>
+#include <QScopedPointer>
+
 #include "scimgdataloader_pgf.h"
 #include "third_party/pgf/PGFimage.h"
 #include "util.h"
@@ -60,11 +62,11 @@
 	try
 	{
 		CPGFFileStream stream(fd);
-		CPGFImage      pgfImg;
-		pgfImg.Open(&stream);
+		QScopedPointer<CPGFImage> pgfImg(new CPGFImage());
+		pgfImg->Open(&stream);
 		int level = 0;
 /*
-        const PGFHeader* header = pgfImg.GetHeader();
+        const PGFHeader* header = pgfImg->GetHeader();
         qDebug() << "PGF width    = " << header->width;
         qDebug() << "PGF height   = " << header->height;
         qDebug() << "PGF bbp      = " << header->bpp;
@@ -73,36 +75,36 @@
         qDebug() << "PGF mode     = " << header->mode;
         qDebug() << "PGF levels   = " << header->nLevels;
 */
-		pgfImg.Read(level);
-		if (pgfImg.BPP() > 32)
+		pgfImg->Read(level);
+		if (pgfImg->BPP() > 32)
 			return false;
-		if (pgfImg.Channels() > 4)
+		if (pgfImg->Channels() > 4)
 			return false;
-		if (pgfImg.Mode() == 2)
+		if (pgfImg->Mode() == 2)
 			return false;
 		if (QSysInfo::ByteOrder == QSysInfo::BigEndian)
 		{
-			if (pgfImg.Channels() == 1)
-			{
-				if (pgfImg.BPP() == 1)
-				{
-					m_image = QImage(pgfImg.Width(level), pgfImg.Height(level), QImage::Format_Mono);
-					int map[] = {0};
-					pgfImg.GetBitmap(m_image.bytesPerLine(), (UINT8*)m_image.bits(), m_image.depth(), map);
+			if (pgfImg->Channels() == 1)
+			{
+				if (pgfImg->BPP() == 1)
+				{
+					m_image = QImage(pgfImg->Width(level), pgfImg->Height(level), QImage::Format_Mono);
+					int map[] = {0};
+					pgfImg->GetBitmap(m_image.bytesPerLine(), (UINT8*)m_image.bits(), m_image.depth(), map);
 					m_image.invertPixels();
 				}
-				else if (pgfImg.BPP() == 8)
+				else if (pgfImg->BPP() == 8)
 				{
 					QByteArray data;
-					data.resize(pgfImg.Width(level) * pgfImg.Height(level));
-					int map[] = {0};
-					pgfImg.GetBitmap(pgfImg.Width(level), (UINT8*)data.data(), 8, map);
-					m_image = QImage(pgfImg.Width(level), pgfImg.Height(level), QImage::Format_ARGB32);
+					data.resize(pgfImg->Width(level) * pgfImg->Height(level));
+					int map[] = {0};
+					pgfImg->GetBitmap(pgfImg->Width(level), (UINT8*)data.data(), 8, map);
+					m_image = QImage(pgfImg->Width(level), pgfImg->Height(level), QImage::Format_ARGB32);
 					int imgDcount = 0;
-					for (uint y = 0; y < pgfImg.Height(level); y++)
+					for (uint y = 0; y < pgfImg->Height(level); y++)
 					{
 						QRgb *q = (QRgb*)(m_image.scanLine(y));
-						for (uint x = 0; x < pgfImg.Width(level); x++)
+						for (uint x = 0; x < pgfImg->Width(level); x++)
 						{
 							uchar r = data[imgDcount++];
 							*q++ = qRgba(r, r, r, 255);
@@ -110,18 +112,18 @@
 					}
 				}
 			}
-			else if (pgfImg.Channels() == 3)
+			else if (pgfImg->Channels() == 3)
 			{
 				QByteArray data;
-				data.resize(pgfImg.Width(level) * pgfImg.Height(level) * 3);
+				data.resize(pgfImg->Width(level) * pgfImg->Height(level) * 3);
 				int map[] = {0, 1, 2};
-				pgfImg.GetBitmap(pgfImg.Width(level) * 3, (UINT8*)data.data(), 24, map);
-				m_image = QImage(pgfImg.Width(level), pgfImg.Height(level), QImage::Format_ARGB32);
+				pgfImg->GetBitmap(pgfImg->Width(level) * 3, (UINT8*)data.data(), 24, map);
+				m_image = QImage(pgfImg->Width(level), pgfImg->Height(level), QImage::Format_ARGB32);
 				int imgDcount = 0;
-				for (uint y = 0; y < pgfImg.Height(); y++)
+				for (uint y = 0; y < pgfImg->Height(); y++)
 				{
 					QRgb *q = (QRgb*)(m_image.scanLine(y));
-					for (uint x = 0; x < pgfImg.Width(); x++)
+					for (uint x = 0; x < pgfImg->Width(); x++)
 					{
 						uchar r = data[imgDcount++];
 						uchar g = data[imgDcount++];
@@ -130,36 +132,36 @@
 					}
 				}
 			}
-			else if (pgfImg.Channels() == 4)
-			{
-				m_image = QImage(pgfImg.Width(level), pgfImg.Height(level), QImage::Format_ARGB32);
+			else if (pgfImg->Channels() == 4)
+			{
+				m_image = QImage(pgfImg->Width(level), pgfImg->Height(level), QImage::Format_ARGB32);
 				int map[] = {3, 2, 1, 0};
-				pgfImg.GetBitmap(m_image.bytesPerLine(), (UINT8*)m_image.bits(), m_image.depth(), map);
+				pgfImg->GetBitmap(m_image.bytesPerLine(), (UINT8*)m_image.bits(), m_image.depth(), map);
 			}
 		}
 		else
 		{
-			if (pgfImg.Channels() == 1)
-			{
-				if (pgfImg.BPP() == 1)
-				{
-					m_image = QImage(pgfImg.Width(level), pgfImg.Height(level), QImage::Format_Mono);
-					int map[] = {0};
-					pgfImg.GetBitmap(m_image.bytesPerLine(), (UINT8*)m_image.bits(), 1, map);
+			if (pgfImg->Channels() == 1)
+			{
+				if (pgfImg->BPP() == 1)
+				{
+					m_image = QImage(pgfImg->Width(level), pgfImg->Height(level), QImage::Format_Mono);
+					int map[] = {0};
+					pgfImg->GetBitmap(m_image.bytesPerLine(), (UINT8*)m_image.bits(), 1, map);
 					m_image.invertPixels();
 				}
-				else if (pgfImg.BPP() == 8)
+				else if (pgfImg->BPP() == 8)
 				{
 					QByteArray data;
-					data.resize(pgfImg.Width(level) * pgfImg.Height(level));
-					int map[] = {0};
-					pgfImg.GetBitmap(pgfImg.Width(level), (UINT8*)data.data(), 8, map);
-					m_image = QImage(pgfImg.Width(level), pgfImg.Height(level), QImage::Format_ARGB32);
+					data.resize(pgfImg->Width(level) * pgfImg->Height(level));
+					int map[] = {0};
+					pgfImg->GetBitmap(pgfImg->Width(level), (UINT8*)data.data(), 8, map);
+					m_image = QImage(pgfImg->Width(level), pgfImg->Height(level), QImage::Format_ARGB32);
 					int imgDcount = 0;
-					for (uint y = 0; y < pgfImg.Height(level); y++)
+					for (uint y = 0; y < pgfImg->Height(level); y++)
 					{
 						QRgb *q = (QRgb*)(m_image.scanLine(y));
-						for (uint x = 0; x < pgfImg.Width(level); x++)
+						for (uint x = 0; x < pgfImg->Width(level); x++)
 						{
 							uchar r = data[imgDcount++];
 							*q++ = qRgba(r, r, r, 255);
@@ -167,18 +169,18 @@
 					}
 				}
 			}
-			else if (pgfImg.Channels() == 3)
+			else if (pgfImg->Channels() == 3)
 			{
 				QByteArray data;
-				data.resize(pgfImg.Width(level) * pgfImg.Height(level) * 3);
+				data.resize(pgfImg->Width(level) * pgfImg->Height(level) * 3);
 				int map[] = {2, 1, 0};
-				pgfImg.GetBitmap(pgfImg.Width(level) * 3, (UINT8*)data.data(), 24, map);
-				m_image = QImage(pgfImg.Width(level), pgfImg.Height(level), QImage::Format_ARGB32);
+				pgfImg->GetBitmap(pgfImg->Width(level) * 3, (UINT8*)data.data(), 24, map);
+				m_image = QImage(pgfImg->Width(level), pgfImg->Height(level), QImage::Format_ARGB32);
 				int imgDcount = 0;
-				for (uint y = 0; y < pgfImg.Height(level); y++)
+				for (uint y = 0; y < pgfImg->Height(level); y++)
 				{
 					QRgb *q = (QRgb*)(m_image.scanLine(y));
-					for (uint x = 0; x < pgfImg.Width(level); x++)
+					for (uint x = 0; x < pgfImg->Width(level); x++)
 					{
 						uchar r = data[imgDcount++];
 						uchar g = data[imgDcount++];
@@ -187,14 +189,14 @@
 					}
 				}
 			}
-			else if (pgfImg.Channels() == 4)
-			{
-				m_image = QImage(pgfImg.Width(level), pgfImg.Height(level), QImage::Format_ARGB32);
+			else if (pgfImg->Channels() == 4)
+			{
+				m_image = QImage(pgfImg->Width(level), pgfImg->Height(level), QImage::Format_ARGB32);
 				int map[] = {0, 1, 2, 3};
-				pgfImg.GetBitmap(m_image.bytesPerLine(), (UINT8*)m_image.bits(), m_image.depth(), map);
+				pgfImg->GetBitmap(m_image.bytesPerLine(), (UINT8*)m_image.bits(), m_image.depth(), map);
 			}
 		}
-		pgfImg.Destroy();
+		pgfImg.reset(nullptr);
 #ifdef WIN32
 		CloseHandle(fd);
 #else




More information about the scribus-commit mailing list