Author: jghali
Date: Thu Feb 22 21:45:49 2018
New Revision: 22405

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=22405
Log:
rewrite AIPlug::decompressAIData() to avoid potential fopen failure on Windows 
if file name contains characters outside current codepage

Modified:
    trunk/Scribus/scribus/plugins/import/ai/importai.cpp

Modified: trunk/Scribus/scribus/plugins/import/ai/importai.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22405&path=/trunk/Scribus/scribus/plugins/import/ai/importai.cpp
==============================================================================
--- trunk/Scribus/scribus/plugins/import/ai/importai.cpp        (original)
+++ trunk/Scribus/scribus/plugins/import/ai/importai.cpp        Thu Feb 22 
21:45:49 2018
@@ -7,6 +7,7 @@
 
 #include <QByteArray>
 #include <QCursor>
+#include <QDataStream>
 #include <QDrag>
 #include <QFile>
 #include <QList>
@@ -28,6 +29,7 @@
 #include "prefsfile.h"
 #include "prefsmanager.h"
 #include "prefstable.h"
+#include "qtiocompressor.h"
 #include "rawimage.h"
 #include "scclocale.h"
 #include "sccolorengine.h"
@@ -715,87 +717,52 @@
 bool AIPlug::decompressAIData(QString &fName)
 {
        QString f2 = fName+"_decom.ai";
-       FILE *source, *dest;
-       int ret;
-       unsigned have;
-       z_stream strm;
-       char in[4096];
-       char out[4096];
-
-       source = fopen(fName.toLocal8Bit().constData(), "rb");
-       if (!source)
+       char buffer[4096];
+
+       QFile source(fName);
+       if (!source.open(QFile::ReadOnly))
                return false;
-       if (fseek(source, 20, SEEK_SET) != 0)
-       {
-               fclose(source);
+       if (!source.seek(20))
+       {
+               source.close();
                return false;
        }
-       dest = fopen(f2.toLocal8Bit().constData(), "wb");
-       if (!dest)
-       {
-               fclose(source);
+
+       QtIOCompressor compressor(&source);
+       compressor.setStreamFormat(QtIOCompressor::ZlibFormat);
+       if (!compressor.open(QIODevice::ReadOnly))
+       {
+               source.close();
                return false;
        }
 
-       strm.zalloc = Z_NULL;
-       strm.zfree = Z_NULL;
-       strm.opaque = Z_NULL;
-       strm.avail_in = 0;
-       strm.next_in = Z_NULL;
-
-       ret = inflateInit(&strm);
-       if (ret != Z_OK)
-       {
-               fclose(source);
-               fclose(dest);
+       QFile dest(f2);
+       if (!dest.open(QFile::WriteOnly))
+       {
+               source.close();
                return false;
        }
-
-       do
-       {
-               strm.avail_in = fread(in, 1, 4096, source);
-               if (ferror(source))
-               {
-                       (void)inflateEnd(&strm);
-                       fclose(source);
-                       fclose(dest);
-                       return false;
-               }
-               if (strm.avail_in == 0)
+       QDataStream destStream(&dest);
+
+       qint64 bytesRead = -1;
+       qint64 bytesWritten = -1;
+
+       bytesRead = compressor.read(buffer, 4096);
+       while (bytesRead > 0)
+       {
+               bytesWritten = destStream.writeRawData(buffer, (int) bytesRead);
+               if (bytesWritten < 0)
                        break;
-               strm.next_in = (Bytef*)in;
-               do
-               {
-                       strm.avail_out = 4096;
-                       strm.next_out = (Bytef*)out;
-                       ret = inflate(&strm, Z_NO_FLUSH);
-                       assert(ret != Z_STREAM_ERROR);
-                       switch (ret)
-                       {
-                               case Z_NEED_DICT:
-                                       ret = Z_DATA_ERROR;
-                               case Z_DATA_ERROR:
-                               case Z_MEM_ERROR:
-                                       (void)inflateEnd(&strm);
-                                       fclose(source);
-                                       fclose(dest);
-                                       return false;
-                       }
-                       have = 4096 - strm.avail_out;
-                       if (fwrite(out, 1, have, dest) != have || ferror(dest))
-                       {
-                               (void)inflateEnd(&strm);
-                               fclose(source);
-                               fclose(dest);
-                               return false;
-                       }
-               }
-               while (strm.avail_out == 0);
-       }
-       while (ret != Z_STREAM_END);
-       (void)inflateEnd(&strm);
-       fclose(source);
-       fclose(dest);
+               bytesRead = compressor.read(buffer, 4096);
+       }
+
+       compressor.close();
+       source.close();
+       dest.close();
+
+       if (bytesRead < 0 || bytesWritten < 0)
+               return false;
+
        if (!convertedPDF)
        {
                QFileInfo bF2(fName);


_______________________________________________
scribus-commit mailing list
scribus-commit@lists.scribus.net
http://lists.scribus.net/mailman/listinfo/scribus-commit

Reply via email to