--- deliantra/server/common/player.C 2007/01/09 01:28:32 1.17 +++ deliantra/server/common/player.C 2007/01/09 21:32:41 1.18 @@ -49,6 +49,7 @@ { if (op != NULL && op->type == PLAYER && op->arch != NULL && op->arch->clone.race != NULL && strcmp (op->arch->clone.race, "dragon") == 0) return 1; + return 0; } @@ -84,7 +85,7 @@ PL_OUT (outputs_sync); PL_OUT (outputs_count); - freezer.put (KW_usekeys, usekeys == key_inventory ? "key_inventory" : (usekeys == keyrings ? "keyrings" : "containers")); + freezer.put (KW_usekeys, usekeys == key_inventory ? "key_inventory" : (usekeys == keyrings ? "keyrings" : "containers")); freezer.put (KW_unapply, unapply == unapply_nochoice ? "unapply_nochoice" : (unapply == unapply_never ? "unapply_never" : "unapply_always")); PL_OUT2 (map, maplevel); @@ -142,6 +143,8 @@ player * player::load_pl (object_thawer &thawer) { + int maxerrs = 10; + player *pl = new player; pl->savebed_map = first_map_path; @@ -158,12 +161,16 @@ { case KW_EOF: LOG (llevError, "%s: unexpected EOF while reading player header\n", thawer.name); - pl->ob->destroy (); - pl->destroy (); - return 0; + goto failure; + + default: + LOG (llevError, "%s: skipping unknown key in player header: %s\n", thawer.name, keyword_str [kw]); + if (!--maxerrs) goto failure; + break; case KW_ERROR: - LOG (llevError, "%s: error while reading player header, skipping (%s,%s)\n", thawer.name, thawer.last_keyword, thawer.last_value); + LOG (llevError, "%s: parse error while reading player header, skipping (%s,%s).\n", thawer.name, thawer.last_keyword, thawer.last_value); + if (!--maxerrs) goto failure; break; case KW_endplst: @@ -233,10 +240,6 @@ } } break; - - default: - LOG (llevError, "%s: skipping unknown key in player header: %s\n", thawer.name, keyword_str [kw]); - break; } } @@ -251,6 +254,14 @@ INVOKE_PLAYER (LOAD, pl); return pl; + +failure: + LOG (llevError, "%s: too many or too grave errors, aborting player load.\n", thawer.name); + + pl->ob->destroy (); + pl->destroy (); + + return 0; } player *