Author: jghali
Date: Tue Jul 28 23:12:38 2020
New Revision: 23958

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=23958
Log:
Fix double free caused by ScribusMainWindow's emergencySave()

Modified:
    branches/Version14x/Scribus/scribus/scribus.cpp

Modified: branches/Version14x/Scribus/scribus/scribus.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23958&path=/branches/Version14x/Scribus/scribus/scribus.cpp
==============================================================================
--- branches/Version14x/Scribus/scribus/scribus.cpp     (original)
+++ branches/Version14x/Scribus/scribus/scribus.cpp     Tue Jul 28 23:12:38 2020
@@ -9260,32 +9260,29 @@
 
 void ScribusMainWindow::emergencySave()
 {
-       emergencyActivated=true;
+       emergencyActivated = true;
        std::cout << "Calling Emergency Save" << std::endl;
        QWidgetList windows = wsp->windowList();
-       if (!windows.isEmpty())
-       {
-               uint windowCount=windows.count();
-               for (uint i=0; i<windowCount ; ++i)
-               {
-                       ActWin = (ScribusWin*)windows.at(i);
-                       doc = ActWin->doc();
-                       view = ActWin->view();
-                       doc->setModified(false);
-                       if (doc->hasName)
-                       {
-                               std::cout << "Saving: " << 
doc->DocName.toStdString() << ".emergency" << std::endl;
-                               doc->autoSaveTimer->stop();
-                               FileLoader fl(doc->DocName+".emergency");
-                               fl.saveFile(doc->DocName+".emergency", doc, 0);
-                       }
-                       view->close();
-                       uint numPages=doc->Pages->count();
-                       for (uint a=0; a<numPages; ++a)
-                               delete doc->Pages->at(a);
-                       delete doc;
-                       ActWin->close();
-               }
+       if (windows.isEmpty())
+               return;
+
+       uint windowCount = windows.count();
+       for (uint i = 0; i < windowCount ; ++i)
+       {
+               ActWin = (ScribusWin*) windows.at(i);
+               doc = ActWin->doc();
+               view = ActWin->view();
+               doc->setModified(false);
+               if (doc->hasName)
+               {
+                       std::cout << "Saving: " << doc->DocName.toStdString() 
<< ".emergency" << std::endl;
+                       doc->autoSaveTimer->stop();
+                       FileLoader fl(doc->DocName+".emergency");
+                       fl.saveFile(doc->DocName+".emergency", doc, 0);
+               }
+               // ActWin->close() will trigger ScribusWin::closeEvent()
+               // so no need to manually close view or delete doc
+               ActWin->close();
        }
 }
 


_______________________________________________
scribus-commit mailing list
[email protected]
http://lists.scribus.net/mailman/listinfo/scribus-commit

Reply via email to