ref: d577aaecab09506988a657fa257c4d0ab85d0cd6
parent: 1aa67e7a75ac21d15780d6aaab65a2c0f6f65198
author: Ben Harris <bjh21@bjh21.me.uk>
date: Mon Feb 13 06:21:11 EST 2023
Free new game_state properly in Mosaic's execute_move() Using sfree() rather than free_game() in the error paths meant that various arrays referenced from the game_state weren't properly freed. Also one error path didn't free the game_state at all.
--- a/mosaic.c
+++ b/mosaic.c
@@ -1282,8 +1282,10 @@
move_params[i] = atoi(p);
while (*p && isdigit((unsigned char)*p)) p++;
if (i+1 < nparams) {
- if (*p != ',')
+ if (*p != ',') {
+ free_game(new_state);
return NULL;
+ }
p++;
}
}
@@ -1299,7 +1301,7 @@
}
cell = get_coords(new_state, new_state->cells_contents, x, y);
if (cell == NULL) {
- sfree(new_state);
+ free_game(new_state);
return NULL;
}
if (*cell >= STATE_OK_NUM) {
@@ -1369,7 +1371,7 @@
cell = get_coords(new_state, new_state->cells_contents,
x + (dirX * i), y + (dirY * i));
if (cell == NULL) {
- sfree(new_state);
+ free_game(new_state);
return NULL;
}
if ((*cell & STATE_OK_NUM) == 0) {