Browse Source

Fix double free and use of dead reference when saving (#445)

karliss 7 years ago
parent
commit
ce0b4b222d
2 changed files with 6 additions and 7 deletions
  1. 5 6
      client/lobby/CSavingScreen.cpp
  2. 1 1
      client/lobby/CSavingScreen.h

+ 5 - 6
client/lobby/CSavingScreen.cpp

@@ -32,7 +32,7 @@ CSavingScreen::CSavingScreen()
 	center(pos);
 	// TODO: we should really use std::shared_ptr for passing StartInfo around.
 	localSi = new StartInfo(*LOCPLINT->cb->getStartInfo());
-	localMi = new CMapInfo();
+	localMi = std::make_shared<CMapInfo>();
 	localMi->mapHeader = std::unique_ptr<CMapHeader>(new CMapHeader(*LOCPLINT->cb->getMapHeader()));
 
 	tabSel = std::make_shared<SelectionTab>(screenType);
@@ -46,12 +46,11 @@ CSavingScreen::CSavingScreen()
 
 CSavingScreen::~CSavingScreen()
 {
-	vstd::clear_pointer(localMi);
 }
 
 const CMapInfo * CSavingScreen::getMapInfo()
 {
-	return localMi;
+	return localMi.get();
 }
 
 const StartInfo * CSavingScreen::getStartInfo()
@@ -61,10 +60,10 @@ const StartInfo * CSavingScreen::getStartInfo()
 
 void CSavingScreen::changeSelection(std::shared_ptr<CMapInfo> to)
 {
-	if(localMi == to.get())
+	if(localMi == to)
 		return;
 
-	localMi = to.get();
+	localMi = to;
 	localSi = localMi->scenarioOptionsOfSave;
 	card->changeSelection();
 }
@@ -76,7 +75,7 @@ void CSavingScreen::saveGame()
 
 	std::string path = "Saves/" + tabSel->inputName->text;
 
-	auto overWrite = [&]() -> void
+	auto overWrite = [this, path]() -> void
 	{
 		Settings lastSave = settings.write["general"]["lastSave"];
 		lastSave->String() = path;

+ 1 - 1
client/lobby/CSavingScreen.h

@@ -19,7 +19,7 @@ class CSavingScreen : public CSelectionBase
 {
 public:
 	const StartInfo * localSi;
-	CMapInfo * localMi;
+	std::shared_ptr<CMapInfo> localMi;
 
 	CSavingScreen();
 	~CSavingScreen();