diff options
| author | Simon Tatham <anakin@pobox.com> | 2010-01-04 19:14:35 +0000 |
|---|---|---|
| committer | Simon Tatham <anakin@pobox.com> | 2010-01-04 19:14:35 +0000 |
| commit | 4dfd8512ab278dd9f68475ace818b29e7e7c17af (patch) | |
| tree | 476bfff253a7f8d53d239f885911b25762f82b6f | |
| parent | 56b421a63295dd8886f4748d1c0a32153e9ff758 (diff) | |
| download | puzzles-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.c | 21 |
1 files changed, 12 insertions, 9 deletions
@@ -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; |