diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2016-09-27 09:54:55 +0100 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2016-09-27 09:54:55 +0100 |
| commit | 1b9eb2c6ba6da849480c299d06abb9bdd9f87786 (patch) | |
| tree | a8fa0902835700d8209cb163a18d55ebbf518f7d /src/option_manager.hh | |
| parent | b74a268552289cc019e2b015678f0fbd1c9e64d9 (diff) | |
Validate option names to be in [a-zA-Z0-9_]
Closes #824
Diffstat (limited to 'src/option_manager.hh')
| -rw-r--r-- | src/option_manager.hh | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/src/option_manager.hh b/src/option_manager.hh index da7dd699..ed0c1ed0 100644 --- a/src/option_manager.hh +++ b/src/option_manager.hh @@ -216,13 +216,22 @@ public: const T& value, OptionFlags flags = OptionFlags::None) { + auto is_not_identifier = [](char c) { + return (c < 'a' or c > 'z') and + (c < 'A' or c > 'Z') and + (c < '0' or c > '9') and c != '_'; + }; + + if (contains_that(name, is_not_identifier)) + throw runtime_error{format("name '{}' contains char out of [a-zA-Z0-9_]", name)}; + auto& opts = m_global_manager.m_options; auto it = find_option(opts, name); if (it != opts.end()) { if ((*it)->is_of_type<T>() and (*it)->flags() == flags) return **it; - throw runtime_error(format("option '{}' already declared with different type or flags", name)); + throw runtime_error{format("option '{}' already declared with different type or flags", name)}; } String doc = docstring.empty() ? format("[{}]", option_type_name<T>::name()) : format("[{}] - {}", option_type_name<T>::name(), docstring); |
