diff options
| author | Simon Tatham <anakin@pobox.com> | 2009-06-17 20:01:45 +0000 |
|---|---|---|
| committer | Simon Tatham <anakin@pobox.com> | 2009-06-17 20:01:45 +0000 |
| commit | 0687980f0c3204d283848ba41761a7724e4a6168 (patch) | |
| tree | fb454b19acbc55db35dd3087648d2dc0de52f0bb /filling.c | |
| parent | 3cd83d05e899e62232b68ea95cf7f07505ebd79f (diff) | |
| download | puzzles-0687980f0c3204d283848ba41761a7724e4a6168.zip puzzles-0687980f0c3204d283848ba41761a7724e4a6168.tar.gz puzzles-0687980f0c3204d283848ba41761a7724e4a6168.tar.bz2 puzzles-0687980f0c3204d283848ba41761a7724e4a6168.tar.xz | |
Memory management and other fixes from James H.
[originally from svn r8596]
Diffstat (limited to 'filling.c')
| -rw-r--r-- | filling.c | 18 |
1 files changed, 11 insertions, 7 deletions
@@ -1138,7 +1138,7 @@ static char *interpret_move(game_state *state, game_ui *ui, game_drawstate *ds, static game_state *execute_move(game_state *state, char *move) { - game_state *new_state; + game_state *new_state = NULL; const int sz = state->shared->params.w * state->shared->params.h; if (*move == 's') { @@ -1149,18 +1149,18 @@ static game_state *execute_move(game_state *state, char *move) } else { int value; char *endptr, *delim = strchr(move, '_'); - if (!delim) return NULL; + if (!delim) goto err; value = strtol(delim+1, &endptr, 0); - if (*endptr || endptr == delim+1) return NULL; - if (value < 0 || value > 9) return NULL; + if (*endptr || endptr == delim+1) goto err; + if (value < 0 || value > 9) goto err; new_state = dup_game(state); while (*move) { const int i = strtol(move, &endptr, 0); - if (endptr == move) return NULL; - if (i < 0 || i >= sz) return NULL; + if (endptr == move) goto err; + if (i < 0 || i >= sz) goto err; new_state->board[i] = value; if (*endptr == '_') break; - if (*endptr != ',') return NULL; + if (*endptr != ',') goto err; move = endptr + 1; } } @@ -1181,6 +1181,10 @@ static game_state *execute_move(game_state *state, char *move) } return new_state; + +err: + if (new_state) free_game(new_state); + return NULL; } /* ---------------------------------------------------------------------- |