rnd-20100624-2-src
authorHolger Schemel <info@artsoft.org>
Thu, 24 Jun 2010 09:28:00 +0000 (11:28 +0200)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:59:37 +0000 (10:59 +0200)
* fixed another memory violation bug in the native Supaplex game engine
  (this potential memory bug was also in the original Megaplex code, but
  apparently only occured under rare conditions triggered by using the
  additional added preceding playfield memory area to make a few strange
  levels using dirty off-playfield tricks (bugs) like "12s033.sp" also
  solvable (this all worked fine in the classic DOS version, of course))

ChangeLog
src/conftime.h
src/game_sp/Explosions.c
src/game_sp/Globals.c
src/game_sp/Globals.h
src/game_sp/file.c
src/game_sp/init.c

index f8da0e50eebbe94d4917c931c93a0f6317fc1115..c2872eedda936364a1a27620e00d2fd75405ba52 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2010-06-24
        * started adding alternative (smaller) tile size option for playing game
+       * fixed another memory violation bug in the native Supaplex game engine
+         (this potential memory bug was also in the original Megaplex code, but
+         apparently only occured under rare conditions triggered by using the
+         additional added preceding playfield memory area to make a few strange
+         levels using dirty off-playfield tricks (bugs) like "12s033.sp" also
+         solvable (this all worked fine in the classic DOS version, of course))
 
 2010-06-23
        * added graphics performance optimization to native Supaplex game engine
index c706413c1f084dd277be59b1857c011707525538..604c7cfbb5596a29cbe00b7fcf3d6eb680127869 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "2010-06-24 01:23"
+#define COMPILE_DATE_STRING "2010-06-24 11:02"
index 4eded7b3444ea83a03b8e37d4143ec92ad692033..867cc27302cf73db8101aa10168b972730bc28d8 100644 (file)
@@ -136,7 +136,7 @@ static void LetExplodeFieldSP(int tsi, int cx, int dh)
 {
   int al;
 
-  if (tsi < (-FieldWidth))
+  if (tsi < -FieldWidth)
     return;
 
   al = LowByte(PlayField16[tsi]);
index 91c715172ee6c8c5981e8b4d5b5149b36ca07031..35bf4d8a9b26385384ec9d95ad628e64e5714300 100644 (file)
@@ -14,12 +14,15 @@ int FieldWidth;             // standard size = 60
 int FieldHeight;       // standard size = 24
 int HeaderSize;                // standard size = 96
 int FieldMax, LevelMax;
+#if 0
 long FileMax;
+#endif
 
 #if 1
 int *PlayField16;
+byte *PlayField8;
 // int PlayField16[SP_MAX_PLAYFIELD_SIZE + SP_HEADER_SIZE];
-byte PlayField8[SP_MAX_PLAYFIELD_SIZE + SP_HEADER_SIZE];
+// byte PlayField8[SP_MAX_PLAYFIELD_SIZE + SP_HEADER_SIZE];
 byte DisPlayField[SP_MAX_PLAYFIELD_SIZE + SP_HEADER_SIZE];
 #else
 int *PlayField16;
@@ -178,11 +181,18 @@ void InitGlobals()
   bPlaying = False;
   menBorder = False;
 
+  /* add preceding playfield buffer (as large as preceding memory area) */
   PlayField16 = checked_calloc((game_sp.preceding_buffer_size +
                                SP_MAX_PLAYFIELD_SIZE +
                                SP_HEADER_SIZE) * sizeof(int));
   PlayField16 = &PlayField16[game_sp.preceding_buffer_size];
 
+  /* add preceding playfield buffer (as large as one playfield row) */
+  PlayField8 = checked_calloc((SP_MAX_PLAYFIELD_WIDTH +
+                              SP_MAX_PLAYFIELD_SIZE +
+                              SP_HEADER_SIZE) * sizeof(byte));
+  PlayField8 = &PlayField8[SP_MAX_PLAYFIELD_WIDTH];
+
 #if 0
   /* these defaults will be changed after reading a Supaplex level file */
   PlayField8 = REDIM_1D(sizeof(byte), 0, FieldMax);
index 4c8798d7c0aadb51d3b4dc7f8647e38d9cdaf4bd..5de5b8c84afe9b9927a8df2e41b142f77a5c6826 100644 (file)
@@ -296,8 +296,9 @@ extern boolean menBorder;
 
 #if 1
 extern int *PlayField16;
+extern byte *PlayField8;
 // extern int PlayField16[SP_MAX_PLAYFIELD_SIZE + SP_HEADER_SIZE];
-extern byte PlayField8[SP_MAX_PLAYFIELD_SIZE + SP_HEADER_SIZE];
+// extern byte PlayField8[SP_MAX_PLAYFIELD_SIZE + SP_HEADER_SIZE];
 extern byte DisPlayField[SP_MAX_PLAYFIELD_SIZE + SP_HEADER_SIZE];
 #else
 extern int *PlayField16;
@@ -313,7 +314,9 @@ extern int HeaderSize;
 extern int TimerVar;
 extern short RandomSeed;
 
+#if 0
 extern long FileMax;
+#endif
 
 extern LevelInfoType LInfo;
 extern int ScrollMinX, ScrollMaxX, ScrollMinY, ScrollMaxY;
index cb5413b0c90df20028478a91f10de596fa8d1ef9..27cb452a08136c6e8a8a0934a4bac64efb35f19c 100644 (file)
@@ -72,8 +72,10 @@ void copyInternalEngineVars_SP()
   FieldMax = (FieldWidth * FieldHeight) + HeaderSize - 1;
   LevelMax = (FieldWidth * FieldHeight) - 1;
 
+#if 0
   /* (add one byte for the level number stored as first byte of demo data) */
   FileMax = FieldMax + native_sp_level.demo.length + 1;
+#endif
 
 #if 0
   PlayField8 = REDIM_1D(sizeof(byte), 0, FileMax);
@@ -81,6 +83,14 @@ void copyInternalEngineVars_SP()
   PlayField16 = REDIM_1D(sizeof(int), -game_sp.preceding_buffer_size, FieldMax);
 #endif
 
+  /* initialize preceding playfield buffer */
+  for (i = -game_sp.preceding_buffer_size; i < 0; i++)
+    PlayField16[i] = 0;
+
+  /* initialize preceding playfield buffer */
+  for (i = -SP_MAX_PLAYFIELD_WIDTH; i < 0; i++)
+    PlayField8[i] = 0;
+
   count = 0;
   for (i = 0; game_sp.preceding_buffer[i] != NULL; i++)
   {
index 8c77d306dfeef8b2401d3baf505bcd45b19d6d40..07bdb9d91482a3294f0e33dd1396a3d079246b59 100644 (file)
@@ -130,7 +130,9 @@ void SaveEngineSnapshotValues_SP()
   SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(FieldHeight));
   SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(FieldMax));
   SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(LevelMax));
+#if 0
   SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(FileMax));
+#endif
 
   SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(TimerVar));
   SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(RandomSeed));