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