Settings: Sanitize setting name everywhere, not just LuaSettings
authorkwolekr <kwolekr@minetest.net>
Wed, 10 Dec 2014 04:52:13 +0000 (23:52 -0500)
committerkwolekr <kwolekr@minetest.net>
Wed, 10 Dec 2014 04:52:13 +0000 (23:52 -0500)
src/script/lua_api/l_settings.cpp
src/settings.cpp
src/settings.h
src/test.cpp

index c2c6f009d8c38a4f55c369b8d89e8b2a74c4359d..13a88ee9598b4ffcdd37910e4fec3f2476f4a6c6 100644 (file)
@@ -73,7 +73,7 @@ int LuaSettings::l_set(lua_State* L)
        std::string key = std::string(luaL_checkstring(L, 2));
        const char* value = luaL_checkstring(L, 3);
 
-       o->m_settings->set(Settings::sanitizeString(key), value);
+       o->m_settings->set(key, value);
 
        return 1;
 }
index 487b3da785605bd4afc1aa877903a79ac5aaafd9..aec4b8f65feaab37300a2a1d996550ded37795be 100644 (file)
@@ -63,16 +63,6 @@ Settings & Settings::operator = (const Settings &other)
 }
 
 
-std::string Settings::sanitizeString(const std::string &value)
-{
-       std::string str = value;
-       for (const char *s = "\t\n\v\f\r\b =\""; *s; s++)
-               str.erase(std::remove(str.begin(), str.end(), *s), str.end());
-
-       return str;
-}
-
-
 std::string Settings::getMultiline(std::istream &is, size_t *num_lines)
 {
        size_t lines = 1;
@@ -689,10 +679,16 @@ void Settings::setEntry(const std::string &name, const void *data,
 {
        Settings *old_group = NULL;
 
+       // Strip any potentially dangerous characters from the name (note the value
+       // has no such restrictions)
+       std::string n(name);
+       for (const char *s = "\t\n\v\f\r\b =\""; *s; s++)
+               n.erase(std::remove(n.begin(), n.end(), *s), n.end());
+
        {
                JMutexAutoLock lock(m_mutex);
 
-               SettingsEntry &entry = set_default ? m_defaults[name] : m_settings[name];
+               SettingsEntry &entry = set_default ? m_defaults[n] : m_settings[n];
                old_group = entry.group;
 
                entry.value    = set_group ? "" : *(const std::string *)data;
index 7241877bdb1093456eeb1637ed8522136c898b30..cf27f26205782364cf812f7d2948fcfd0e04f3af 100644 (file)
@@ -55,6 +55,7 @@ struct ValueSpec {
                type = a_type;
                help = a_help;
        }
+
        ValueType type;
        const char *help;
 };
@@ -112,7 +113,6 @@ public:
                const std::string &end, u32 tab_depth=0);
 
        static std::string getMultiline(std::istream &is, size_t *num_lines=NULL);
-       static std::string sanitizeString(const std::string &value);
        static void printEntry(std::ostream &os, const std::string &name,
                const SettingsEntry &entry, u32 tab_depth=0);
 
index 63d8219a9ab7ff68e1e55629a00fc30fbfe243ab..adae8ff572edec739f87fe2fa7d8929147dd7261 100644 (file)
@@ -531,7 +531,9 @@ struct TestSettings: public TestBase
                group2->setS16("num_oranges", 53);
                group2->setGroup("animals", group3);
                group2->set("animals", "cute"); //destroys group 3
-               s.setGroup("groupy_thing", group2);
+
+               // the bad chars in here should be stripped
+               s.setGroup("groupy  \"_\"  thing", group2);
 
                // Test multiline settings
                UASSERT(group->get("ccc") == "testy\n   testa   ");