aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Tatham <anakin@pobox.com>2010-01-04 19:14:35 +0000
committerSimon Tatham <anakin@pobox.com>2010-01-04 19:14:35 +0000
commit4dfd8512ab278dd9f68475ace818b29e7e7c17af (patch)
tree476bfff253a7f8d53d239f885911b25762f82b6f
parent56b421a63295dd8886f4748d1c0a32153e9ff758 (diff)
downloadpuzzles-4dfd8512ab278dd9f68475ace818b29e7e7c17af.zip
puzzles-4dfd8512ab278dd9f68475ace818b29e7e7c17af.tar.gz
puzzles-4dfd8512ab278dd9f68475ace818b29e7e7c17af.tar.bz2
puzzles-4dfd8512ab278dd9f68475ace818b29e7e7c17af.tar.xz
Memory leak fix from Tiago Dionizio: whenever we free the midend's
collection of game states, we should also free the move strings from which they were constructed. [originally from svn r8805]
-rw-r--r--midend.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/midend.c b/midend.c
index 1ba0fa3..05ea663 100644
--- a/midend.c
+++ b/midend.c
@@ -156,6 +156,15 @@ midend *midend_new(frontend *fe, const game *ourgame,
return me;
}
+static void midend_purge_states(midend *me)
+{
+ while (me->nstates > me->statepos) {
+ me->ourgame->free_game(me->states[--me->nstates].state);
+ if (me->states[me->nstates].movestr)
+ sfree(me->states[me->nstates].movestr);
+ }
+}
+
static void midend_free_game(midend *me)
{
while (me->nstates > 0) {
@@ -511,8 +520,7 @@ void midend_restart_game(midend *me)
* Now enter the restarted state as the next move.
*/
midend_stop_anim(me);
- while (me->nstates > me->statepos)
- me->ourgame->free_game(me->states[--me->nstates].state);
+ midend_purge_states(me);
ensure(me);
me->states[me->nstates].state = s;
me->states[me->nstates].movestr = dupstr(me->desc);
@@ -587,8 +595,7 @@ static int midend_really_process_key(midend *me, int x, int y, int button)
goto done;
} else if (s) {
midend_stop_anim(me);
- while (me->nstates > me->statepos)
- me->ourgame->free_game(me->states[--me->nstates].state);
+ midend_purge_states(me);
ensure(me);
assert(movestr != NULL);
me->states[me->nstates].state = s;
@@ -1292,11 +1299,7 @@ char *midend_solve(midend *me)
* Now enter the solved state as the next move.
*/
midend_stop_anim(me);
- while (me->nstates > me->statepos) {
- me->ourgame->free_game(me->states[--me->nstates].state);
- if (me->states[me->nstates].movestr)
- sfree(me->states[me->nstates].movestr);
- }
+ midend_purge_states(me);
ensure(me);
me->states[me->nstates].state = s;
me->states[me->nstates].movestr = movestr;