<URL: http://bugs.freeciv.org/Ticket/Display.html?id=40564 >
This patch aboids crash when saving game when ruleset defines no base types. - ML
diff -Nurd -X.diff_ignore freeciv/server/savegame.c freeciv/server/savegame.c --- freeciv/server/savegame.c 2008-11-10 17:14:45.000000000 +0200 +++ freeciv/server/savegame.c 2008-11-15 00:20:48.000000000 +0200 @@ -4356,12 +4356,17 @@ } if (has_capability("bases", savefile_options)) { - char **modname; + char **modname = NULL; int nmod; int j; - modname = secfile_lookup_str_vec(file, &nmod, - "savefile.bases"); + nmod = secfile_lookup_int_default(file, 0, "savefile.num_bases"); + + if (nmod > 0) { + modname = secfile_lookup_str_vec(file, &nmod, + "savefile.bases"); + } + /* make sure that the size of the array is divisible by 4 */ base_order = fc_calloc(nmod + (4 - (nmod % 4)), sizeof(*base_order)); for (j = 0; j < nmod; j++) { @@ -4812,19 +4817,22 @@ free(modname); } { - const char **modname; - int i = 0; + secfile_insert_int(file, game.control.num_base_types, "savefile.num_bases"); + if (game.control.num_base_types > 0) { + const char **modname; + int i = 0; - /* Save specials order */ - modname = fc_calloc(game.control.num_base_types, sizeof(*modname)); + /* Save bases order */ + modname = fc_calloc(game.control.num_base_types, sizeof(*modname)); - base_type_iterate(pbase) { - modname[i++] = base_rule_name(pbase); - } base_type_iterate_end; + base_type_iterate(pbase) { + modname[i++] = base_rule_name(pbase); + } base_type_iterate_end; - secfile_insert_str_vec(file, modname, game.control.num_base_types, - "savefile.bases"); - free(modname); + secfile_insert_str_vec(file, modname, game.control.num_base_types, + "savefile.bases"); + free(modname); + } } /* [game] */
_______________________________________________ Freeciv-dev mailing list Freeciv-dev@gna.org https://mail.gna.org/listinfo/freeciv-dev