chiark / gitweb /
More defensive-coding fixes from James H.
authorSimon Tatham <anakin@pobox.com>
Wed, 1 Jul 2009 22:01:21 +0000 (22:01 +0000)
committerSimon Tatham <anakin@pobox.com>
Wed, 1 Jul 2009 22:01:21 +0000 (22:01 +0000)
[originally from svn r8605]

cube.c
filling.c
loopy.c
pattern.c

diff --git a/cube.c b/cube.c
index ae3f71689903602a4e5ac3efaf5dbdda0e76fcfe..18787c02687f78916804bb348d116f1ecef0a290 100644 (file)
--- a/cube.c
+++ b/cube.c
@@ -996,6 +996,7 @@ static void free_game(game_state *state)
        sfree(state->grid->squares);
        sfree(state->grid);
     }
+    sfree(state->bluemask);
     sfree(state->facecolours);
     sfree(state);
 }
index a797d098f38640f4defff6dd55cd59d99e8ef752..3fcc3b1528a1b8efdd267ca96cd13c8f6a09a5df 100644 (file)
--- a/filling.c
+++ b/filling.c
@@ -1500,7 +1500,7 @@ static void draw_grid(drawing *dr, game_drawstate *ds, game_state *state,
 
             if (flashy || !shading) {
                 /* clear all background flags */
-            } else if (ui->sel && ui->sel[y*w+x]) {
+            } else if (ui && ui->sel && ui->sel[y*w+x]) {
                 flags |= HIGH_BG;
             } else if (v) {
                 int size = dsf_size(ds->dsf_scratch, y*w+x);
@@ -1509,7 +1509,7 @@ static void draw_grid(drawing *dr, game_drawstate *ds, game_state *state,
                 else if (size > v)
                     flags |= ERROR_BG;
             }
-            if (ui->cur_visible && x == ui->cur_x && y == ui->cur_y)
+            if (ui && ui->cur_visible && x == ui->cur_x && y == ui->cur_y)
               flags |= CURSOR_SQ;
 
             /*
diff --git a/loopy.c b/loopy.c
index 242e9835c2b9260de1c0ec939f8d60fd9671f99b..de4d6a48dc42132bf9ce803fe5e1173663b23435 100644 (file)
--- a/loopy.c
+++ b/loopy.c
@@ -1513,6 +1513,7 @@ static void add_full_clues(game_state *state, random_state *rs)
     face_scores = snewn(num_faces, struct face_score);
     for (i = 0; i < num_faces; i++) {
         face_scores[i].random = random_bits(rs, 31);
+        face_scores[i].black_score = face_scores[i].white_score = 0;
     }
     
     /* Colour a random, finite face white.  The infinite face is implicitly
@@ -3232,6 +3233,8 @@ static game_state *execute_move(game_state *state, char *move)
 
     while (*move) {
         i = atoi(move);
+        if (i < 0 || i >= newstate->game_grid->num_edges)
+            goto fail;
         move += strspn(move, "1234567890");
         switch (*(move++)) {
          case 'y':
index 274fcdb3440cfe899d48f8408dbc48b59d6ab172..68383d71377594061065593347a3407f64f774c9 100644 (file)
--- a/pattern.c
+++ b/pattern.c
@@ -1045,6 +1045,7 @@ static game_drawstate *game_new_drawstate(drawing *dr, game_state *state)
     ds->visible = snewn(ds->w * ds->h, unsigned char);
     ds->tilesize = 0;                  /* not decided yet */
     memset(ds->visible, 255, ds->w * ds->h);
+    ds->cur_x = ds->cur_y = 0;
 
     return ds;
 }