shithub: puzzles

Download patch

ref: 38cf1955e5861f67d385ede006c5b5d1701aca8d
parent: c2eedeedfe3c48f3f013fb1308f61d7ef94e8b2c
author: Ben Harris <bjh21@bjh21.me.uk>
date: Thu Jan 12 16:00:22 EST 2023

Palisade: don't leak memory on a bad move

Invalid moves can turn up in corrupted save files, and puzzles
shouldn't leak memory when failing to load a corrupted save file.

--- a/palisade.c
+++ b/palisade.c
@@ -1020,7 +1020,7 @@
         for (i = 0; i < wh && move[i]; ++i)
             ret->borders[i] =
                 (move[i] & BORDER_MASK) | DISABLED(~move[i] & BORDER_MASK);
-        if (i < wh || move[i]) return NULL; /* leaks `ret', then we die */
+        if (i < wh || move[i]) goto badmove;
         ret->cheated = ret->completed = true;
         return ret;
     }
@@ -1036,7 +1036,7 @@
         ret->borders[y*w + x] ^= flag;
     }
 
-    if (*move) return NULL; /* leaks `ret', then we die */
+    if (*move) goto badmove;
 
     if (!ret->completed)
         ret->completed = is_solved(&ret->shared->params, ret->shared->clues,
@@ -1045,7 +1045,7 @@
     return ret;
 
   badmove:
-    sfree(ret);
+    free_game(ret);
     return NULL;
 }