Author: jtn
Date: Tue Jun 17 00:06:27 2014
New Revision: 25169

URL: http://svn.gna.org/viewcvs/freeciv?rev=25169&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:
    branches/S2_4/server/savegame.c
    branches/S2_4/server/savegame2.c

Modified: branches/S2_4/server/savegame.c
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_4/server/savegame.c?rev=25169&r1=25168&r2=25169&view=diff
==============================================================================
--- branches/S2_4/server/savegame.c     (original)
+++ branches/S2_4/server/savegame.c     Tue Jun 17 00:06:27 2014
@@ -1943,6 +1943,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;
     int base;
@@ -1969,9 +1970,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: branches/S2_4/server/savegame2.c
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_4/server/savegame2.c?rev=25169&r1=25168&r2=25169&view=diff
==============================================================================
--- branches/S2_4/server/savegame2.c    (original)
+++ branches/S2_4/server/savegame2.c    Tue Jun 17 00:06:27 2014
@@ -4562,6 +4562,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