Author: jtn
Date: Mon Jun 16 23:57:03 2014
New Revision: 25156

URL: http://svn.gna.org/viewcvs/freeciv?rev=25156&view=rev
Log:
Protect against savegames where a unit has a higher veteran level than
the current ruleset permits it.

See gna bug #22172.

Modified:
    trunk/server/savegame.c
    trunk/server/savegame2.c

Modified: trunk/server/savegame.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/server/savegame.c?rev=25156&r1=25155&r2=25156&view=diff
==============================================================================
--- trunk/server/savegame.c     (original)
+++ trunk/server/savegame.c     Mon Jun 16 23:57:03 2014
@@ -1170,6 +1170,7 @@
     int nat_x, nat_y;
     const char* type_name;
     struct unit_type *type;
+    int veteran;
     enum tile_special_type target;
     struct base_type *pbase = NULL;
     struct road_type *proad = NULL;
@@ -1191,9 +1192,19 @@
                 plrno, i, type_name);
       exit(EXIT_FAILURE);
     }
+
+    veteran
+      = secfile_lookup_int_default(file, 0, "player%d.u%d.veteran", plrno, i);
+    {
+      /* Protect against change in veteran system in ruleset */
+      const int levels = utype_veteran_levels(type);
+      if (veteran >= levels) {
+        fc_assert(levels >= 1);
+        veteran = levels - 1;
+      }
+    }
     
-    punit = unit_virtual_create(plr, NULL, type,
-      secfile_lookup_int_default(file, 0, "player%d.u%d.veteran", plrno, i));
+    punit = unit_virtual_create(plr, NULL, type, veteran);
     fc_assert_exit_msg(secfile_lookup_int(file, &punit->id,
                                           "player%d.u%d.id", plrno, i),
                        "%s", secfile_error());

Modified: trunk/server/savegame2.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/server/savegame2.c?rev=25156&r1=25155&r2=25156&view=diff
==============================================================================
--- trunk/server/savegame2.c    (original)
+++ trunk/server/savegame2.c    Mon Jun 16 23:57:03 2014
@@ -5155,6 +5155,14 @@
 
   punit->veteran
     = secfile_lookup_int_default(loading->file, 0, "%s.veteran", unitstr);
+  {
+    /* Protect against change in veteran system in ruleset */
+    const int levels = utype_veteran_levels(unit_type(punit));
+    if (punit->veteran >= levels) {
+      fc_assert(levels >= 1);
+      punit->veteran = levels - 1;
+    }
+  }
   punit->done_moving
     = secfile_lookup_bool_default(loading->file, (punit->moves_left == 0),
                                   "%s.done_moving", unitstr);


_______________________________________________
Freeciv-commits mailing list
Freeciv-commits@gna.org
https://mail.gna.org/listinfo/freeciv-commits

Reply via email to