summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/base/statistics.cc34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/base/statistics.cc b/src/base/statistics.cc
index 8bbc4bf36..f1a368f47 100644
--- a/src/base/statistics.cc
+++ b/src/base/statistics.cc
@@ -138,9 +138,43 @@ Info::~Info()
{
}
+bool
+validateStatName(const string &name)
+{
+ if (name.empty())
+ return false;
+
+ vector<string> vec;
+ tokenize(vec, name, '.');
+ vector<string>::const_iterator item = vec.begin();
+ while (item != vec.end()) {
+ if (item->empty())
+ return false;
+
+ string::const_iterator c = item->begin();
+
+ // The first character is different
+ if (!isalpha(*c) && *c != '_')
+ return false;
+
+ // The rest of the characters have different rules.
+ while (++c != item->end()) {
+ if (!isalnum(*c) && *c != '_')
+ return false;
+ }
+
+ ++item;
+ }
+
+ return true;
+}
+
void
Info::setName(const string &name)
{
+ if (!validateStatName(name))
+ panic("invalid stat name '%s'", name);
+
pair<NameMapType::iterator, bool> p =
nameMap().insert(make_pair(name, this));