<URL: http://bugs.freeciv.org/Ticket/Display.html?id=40197 >

 $subject, at least S2_1 affected.

 Change affecting all games is in terrains_free(). Client side changes
are more protection against bad network data.


 - ML

diff -Nurd -X.diff_ignore freeciv/client/packhand.c freeciv/client/packhand.c
--- freeciv/client/packhand.c	2008-01-22 03:47:26.000000000 +0200
+++ freeciv/client/packhand.c	2008-04-07 12:09:49.000000000 +0300
@@ -2459,6 +2459,9 @@
     pterrain->output[o] = p->output[o];
   } output_type_iterate_end;
 
+  if (pterrain->resources != NULL) {
+    free(pterrain->resources);
+  }
   pterrain->resources = fc_calloc(p->num_resources + 1,
 				  sizeof(*pterrain->resources));
   for (j = 0; j < p->num_resources; j++) {
@@ -2488,9 +2491,12 @@
   pterrain->fortress_time = p->fortress_time;
   pterrain->clean_pollution_time = p->clean_pollution_time;
   pterrain->clean_fallout_time = p->clean_fallout_time;
-  
+
   pterrain->flags = p->flags;
 
+  if (pterrain->helptext != NULL) {
+    free(pterrain->helptext);
+  }
   pterrain->helptext = mystrdup(p->helptext);
   
   tileset_setup_tile_type(tileset, pterrain);
diff -Nurd -X.diff_ignore freeciv/common/terrain.c freeciv/common/terrain.c
--- freeciv/common/terrain.c	2007-11-28 02:28:29.000000000 +0200
+++ freeciv/common/terrain.c	2008-04-07 12:08:56.000000000 +0300
@@ -230,8 +230,16 @@
 void terrains_free(void)
 {
   terrain_type_iterate(pterrain) {
-    free(pterrain->helptext);
-    pterrain->helptext = NULL;
+    if (pterrain->helptext != NULL) {
+      free(pterrain->helptext);
+      pterrain->helptext = NULL;
+    }
+    if (pterrain->resources != NULL) {
+      /* Server allocates this on ruleset loading, client when
+       * ruleset packet is received. */
+      free(pterrain->resources);
+      pterrain->resources = NULL;
+    }
   } terrain_type_iterate_end;
 }
 
_______________________________________________
Freeciv-dev mailing list
Freeciv-dev@gna.org
https://mail.gna.org/listinfo/freeciv-dev

Reply via email to