shithub: puzzles

Download patch

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) {