(svn r19865) -Fix [FS#3830]: crash when changing locale settings from console due to strcpy-ing a string into a pointer

This commit is contained in:
rubidium 2010-05-20 15:14:10 +00:00
parent f1c1812e47
commit dd743bcea1
2 changed files with 13 additions and 6 deletions

View File

@ -1713,15 +1713,22 @@ uint GetCompanySettingIndex(const char *name)
* Set a setting value with a string. * Set a setting value with a string.
* @param index the settings index. * @param index the settings index.
* @param value the value to write * @param value the value to write
* @note CANNOT BE SAVED IN THE SAVEGAME. * @param force_newgame force the newgame settings
* @note Strings WILL NOT be synced over the network
*/ */
bool SetSettingValue(uint index, const char *value) bool SetSettingValue(uint index, const char *value, bool force_newgame)
{ {
const SettingDesc *sd = &_settings[index]; const SettingDesc *sd = &_settings[index];
assert(sd->save.conv & SLF_NETWORK_NO); assert(sd->save.conv & SLF_NETWORK_NO);
char *var = (char*)GetVariableAddress(NULL, &sd->save); if (GetVarMemType(sd->save.conv) == SLE_VAR_STRQ) {
ttd_strlcpy(var, value, sd->save.length); char **var = (char**)GetVariableAddress((_game_mode == GM_MENU || force_newgame) ? &_settings_newgame : &_settings_game, &sd->save);
free(*var);
*var = strcmp(value, "(null)") == 0 ? NULL : strdup(value);
} else {
char *var = (char*)GetVariableAddress(NULL, &sd->save);
ttd_strlcpy(var, value, sd->save.length);
}
if (sd->desc.proc != NULL) sd->desc.proc(0); if (sd->desc.proc != NULL) sd->desc.proc(0);
return true; return true;
@ -1778,7 +1785,7 @@ void IConsoleSetSetting(const char *name, const char *value, bool force_newgame)
bool success; bool success;
if (sd->desc.cmd == SDT_STRING) { if (sd->desc.cmd == SDT_STRING) {
success = SetSettingValue(index, value); success = SetSettingValue(index, value, force_newgame);
} else { } else {
uint32 val; uint32 val;
extern bool GetArgumentInteger(uint32 *value, const char *arg); extern bool GetArgumentInteger(uint32 *value, const char *arg);

View File

@ -86,7 +86,7 @@ typedef SettingDesc SettingDescGlobVarList;
const SettingDesc *GetSettingFromName(const char *name, uint *i); const SettingDesc *GetSettingFromName(const char *name, uint *i);
bool SetSettingValue(uint index, int32 value, bool force_newgame = false); bool SetSettingValue(uint index, int32 value, bool force_newgame = false);
bool SetSettingValue(uint index, const char *value); bool SetSettingValue(uint index, const char *value, bool force_newgame = false);
void SetCompanySetting(uint index, int32 value); void SetCompanySetting(uint index, int32 value);
extern VehicleDefaultSettings _old_vds; extern VehicleDefaultSettings _old_vds;