1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-12-01 23:12:49 +02:00

Fix use-after-free in spell window

This commit is contained in:
AlexVinS
2015-04-11 09:24:51 +03:00
parent 5b29e800f7
commit a061e3c2f7
2 changed files with 15 additions and 3 deletions

View File

@@ -1,6 +1,8 @@
#include "StdInc.h"
#include "CSpellWindow.h"
#include "../../lib/ScopeGuard.h"
#include "CAdvmapInterface.h"
#include "GUIClasses.h"
#include "InfoWindows.h"
@@ -528,7 +530,10 @@ void CSpellWindow::turnPageRight()
void CSpellWindow::keyPressed(const SDL_KeyboardEvent & key)
{
if(key.keysym.sym == SDLK_ESCAPE || key.keysym.sym == SDLK_RETURN)
{
fexitb();
return;
}
if(key.state == SDL_PRESSED)
{
@@ -635,8 +640,9 @@ void CSpellWindow::SpellArea::clickLeft(tribool down, bool previousState)
{
case ESpellCastProblem::OK:
{
owner->fexitb();
owner->myInt->battleInt->castThisSpell(mySpell);
owner->fexitb();
return;
}
break;
case ESpellCastProblem::ANOTHER_ELEMENTAL_SUMMONED:
@@ -698,8 +704,14 @@ void CSpellWindow::SpellArea::clickLeft(tribool down, bool previousState)
else if(sp->isAdventureSpell() && !owner->myInt->battleInt) //adventure spell and not in battle
{
const CGHeroInstance *h = owner->myHero;
owner->fexitb();
GH.popInt(owner);
auto guard = vstd::makeScopeGuard([this]
{
(LOCPLINT->battleInt ? owner->myInt->spellbookSettings.spellbookLastTabBattle : owner->myInt->spellbookSettings.spellbookLastTabAdvmap) = owner->selectedTab;
(LOCPLINT->battleInt ? owner->myInt->spellbookSettings.spellbookLastPageBattle : owner->myInt->spellbookSettings.spellbokLastPageAdvmap) = owner->currentPage;
delete owner;
});
if(mySpell == SpellID::TOWN_PORTAL)
{