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