diff options
author | kwolekr <kwolekr@minetest.net> | 2014-12-12 00:44:17 -0500 |
---|---|---|
committer | kwolekr <kwolekr@minetest.net> | 2014-12-12 00:44:17 -0500 |
commit | d3dc88fe6bae0371c3e314cfc6db4ca8a06a4ab6 (patch) | |
tree | 58d1096e81c9b7dd01a7b3fc7f3583ea85194ab7 /src/settings.cpp | |
parent | b0c4fd6d3f1c8e44896358ee9b0af20e9b304944 (diff) | |
download | minetest-d3dc88fe6bae0371c3e314cfc6db4ca8a06a4ab6.tar.gz minetest-d3dc88fe6bae0371c3e314cfc6db4ca8a06a4ab6.tar.bz2 minetest-d3dc88fe6bae0371c3e314cfc6db4ca8a06a4ab6.zip |
Settings: Fail on invalid sequence and throw exception for LuaSettings
Diffstat (limited to 'src/settings.cpp')
-rw-r--r-- | src/settings.cpp | 98 |
1 files changed, 64 insertions, 34 deletions
diff --git a/src/settings.cpp b/src/settings.cpp index 8d2e9fa6c..a8b15b6c2 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -63,6 +63,30 @@ Settings & Settings::operator = (const Settings &other) } +bool Settings::checkNameValid(const std::string &name) +{ + size_t pos = name.find_first_of("\t\n\v\f\r\b =\"{}#"); + if (pos != std::string::npos) { + errorstream << "Invalid character '" << name[pos] + << "' found in setting name" << std::endl; + return false; + } + return true; +} + + +bool Settings::checkValueValid(const std::string &value) +{ + if (value.substr(0, 3) == "\"\"\"" || + value.find("\n\"\"\"") != std::string::npos) { + errorstream << "Invalid character sequence '\"\"\"' found in" + " setting value" << std::endl; + return false; + } + return true; +} + + std::string Settings::sanitizeName(const std::string &name) { std::string n(name); @@ -704,112 +728,119 @@ bool Settings::getFlagStrNoEx(const std::string &name, u32 &val, * Setters * ***********/ -void Settings::setEntry(const std::string &name, const void *data, +bool Settings::setEntry(const std::string &name, const void *data, bool set_group, bool set_default) { Settings *old_group = NULL; - std::string n = sanitizeName(name); + if (!checkNameValid(name)) + return false; + if (!set_group && !checkValueValid(*(const std::string *)data)) + return false; { JMutexAutoLock lock(m_mutex); - SettingsEntry &entry = set_default ? m_defaults[n] : m_settings[n]; + SettingsEntry &entry = set_default ? m_defaults[name] : m_settings[name]; old_group = entry.group; - entry.value = set_group ? "" : sanitizeValue(*(const std::string *)data); + entry.value = set_group ? "" : *(const std::string *)data; entry.group = set_group ? *(Settings **)data : NULL; entry.is_group = set_group; } delete old_group; + + return true; } -void Settings::set(const std::string &name, const std::string &value) +bool Settings::set(const std::string &name, const std::string &value) { - setEntry(name, &value, false, false); + if (!setEntry(name, &value, false, false)) + return false; doCallbacks(name); + return true; } -void Settings::setDefault(const std::string &name, const std::string &value) +bool Settings::setDefault(const std::string &name, const std::string &value) { - setEntry(name, &value, false, true); + return setEntry(name, &value, false, true); } -void Settings::setGroup(const std::string &name, Settings *group) +bool Settings::setGroup(const std::string &name, Settings *group) { - setEntry(name, &group, true, false); + return setEntry(name, &group, true, false); } -void Settings::setGroupDefault(const std::string &name, Settings *group) +bool Settings::setGroupDefault(const std::string &name, Settings *group) { - setEntry(name, &group, true, true); + return setEntry(name, &group, true, true); } -void Settings::setBool(const std::string &name, bool value) +bool Settings::setBool(const std::string &name, bool value) { - set(name, value ? "true" : "false"); + return set(name, value ? "true" : "false"); } -void Settings::setS16(const std::string &name, s16 value) +bool Settings::setS16(const std::string &name, s16 value) { - set(name, itos(value)); + return set(name, itos(value)); } -void Settings::setU16(const std::string &name, u16 value) +bool Settings::setU16(const std::string &name, u16 value) { - set(name, itos(value)); + return set(name, itos(value)); } -void Settings::setS32(const std::string &name, s32 value) +bool Settings::setS32(const std::string &name, s32 value) { - set(name, itos(value)); + return set(name, itos(value)); } -void Settings::setU64(const std::string &name, u64 value) +bool Settings::setU64(const std::string &name, u64 value) { std::ostringstream os; os << value; - set(name, os.str()); + return set(name, os.str()); } -void Settings::setFloat(const std::string &name, float value) +bool Settings::setFloat(const std::string &name, float value) { - set(name, ftos(value)); + return set(name, ftos(value)); } -void Settings::setV2F(const std::string &name, v2f value) +bool Settings::setV2F(const std::string &name, v2f value) { std::ostringstream os; os << "(" << value.X << "," << value.Y << ")"; - set(name, os.str()); + return set(name, os.str()); } -void Settings::setV3F(const std::string &name, v3f value) +bool Settings::setV3F(const std::string &name, v3f value) { std::ostringstream os; os << "(" << value.X << "," << value.Y << "," << value.Z << ")"; - set(name, os.str()); + return set(name, os.str()); } -void Settings::setFlagStr(const std::string &name, u32 flags, +bool Settings::setFlagStr(const std::string &name, u32 flags, const FlagDesc *flagdesc, u32 flagmask) { - set(name, writeFlagString(flags, flagdesc, flagmask)); + return set(name, writeFlagString(flags, flagdesc, flagmask)); } @@ -820,12 +851,11 @@ bool Settings::setStruct(const std::string &name, const std::string &format, if (!serializeStructToString(&structstr, format, value)) return false; - set(name, structstr); - return true; + return set(name, structstr); } -void Settings::setNoiseParams(const std::string &name, +bool Settings::setNoiseParams(const std::string &name, const NoiseParams &np, bool set_default) { Settings *group = new Settings; @@ -839,7 +869,7 @@ void Settings::setNoiseParams(const std::string &name, group->setFloat("lacunarity", np.lacunarity); group->setFlagStr("flags", np.flags, flagdesc_noiseparams, np.flags); - setEntry(name, &group, true, set_default); + return setEntry(name, &group, true, set_default); } |