Przeglądaj źródła

Fixed unsecure deinitialization

Ivan Arkhipov 3 lat temu
rodzic
commit
ed9eec0ba4

+ 23 - 14
src/Legacy/models/patchinstaller.cpp

@@ -27,7 +27,7 @@ QString getComponentNameFromId(int id) {
 }
 
 void PatchInstaller::createDatFile(int id, QString name, int component, QString path){
-    datfiles[id] = *new datfile;
+    datfiles[id] = datfile();
     datfiles[id].id = id;
     datfiles[id].name = name;
     datfiles[id].path = path;
@@ -42,7 +42,7 @@ void PatchInstaller::createDatFile(int id, QString name, int component, QString
     }
 }
 
-QMap<int, PatchInstaller::datfile> PatchInstaller::getDatFiles(){
+const QMap<int, PatchInstaller::datfile>& PatchInstaller::getDatFiles(){
     return this->datfiles;
 }
 
@@ -73,9 +73,6 @@ void PatchInstaller::checkIfUpdatedByGame(){
 
 PatchInstaller::~PatchInstaller() {
     deinit();
-    delete datfiles[0].file;
-    delete datfiles[1].file;
-    delete datfiles[3].file;
 }
 
 // ############## PRIVATE ############## //
@@ -98,9 +95,22 @@ bool PatchInstaller::datPathIsRelevant() {
 }
 
 void PatchInstaller::deinit() {
-    datfiles[0].file->Deinit();
-    datfiles[1].file->Deinit();
-    datfiles[3].file->Deinit();
+    if (datfiles.find(0) != datfiles.end() && datfiles[0].file) {
+        datfiles[0].file->Deinit(); // Сначала деинициализируем сам dat-файл
+        delete datfiles[0].file; // Чистим память за объектом dat-файла
+        datfiles.remove(0); // Удаляем служебную инфу по dat-файлу
+    }
+    if (datfiles.find(1) != datfiles.end() && datfiles[1].file) {
+        datfiles[1].file->Deinit();
+        delete datfiles[1].file;
+        datfiles.remove(1);
+    }
+
+    if (datfiles.find(3) != datfiles.end() && datfiles[3].file) {
+        datfiles[3].file->Deinit();
+        delete datfiles[3].file;
+        datfiles.remove(3);
+    }
     emit deinitialized();
 }
 
@@ -440,6 +450,9 @@ void PatchInstaller::init()
     qInfo() << "PatchInstaller: Starting initialisation of LotroDatManager";
     qRegisterMetaType<PatchInstaller::Status>();
 
+    // Деинициализируем старые файлы, если они были
+    deinit();
+
     // Создаем массив нужных нам dat-файлов
     QString game_folder = Settings::getValue("Lotro/game_path").toString();
     QString locale_prefix = Settings::getValue("Lotro/original_locale").toString();
@@ -473,11 +486,8 @@ void PatchInstaller::startGame(bool remove_dat_files) {
         args << "-skiprawdownload";
     }
 
-    datfiles[0].file->Deinit();
-    datfiles[1].file->Deinit();
-    datfiles[3].file->Deinit();
-
-    if(remove_dat_files){
+    deinit();
+    if (remove_dat_files){
         QFile::remove(datfiles[0].path);
         QFile::remove(datfiles[1].path);
     }
@@ -490,7 +500,6 @@ void PatchInstaller::startGame(bool remove_dat_files) {
 
     qInfo() << "Starting LOTRO. Path =" << game_folder;
 
-    deinit();
 
     QProcess process;
     process.startDetached(game_folder + "/LotroLauncher.exe", args, game_folder);

+ 1 - 1
src/Legacy/models/patchinstaller.h

@@ -82,7 +82,7 @@ private:
     void insertPatchesInfoInDatFile(const AppliedPatchesInfo& info);
 
     void createDatFile(int id, QString name, int component, QString path);
-    QMap<int, datfile> getDatFiles();
+    const QMap<int, datfile>& getDatFiles();
 
 public slots:
     void deinit();