diff options
author | A. Unique TensorFlower <gardener@tensorflow.org> | 2018-04-18 13:13:02 -0700 |
---|---|---|
committer | TensorFlower Gardener <gardener@tensorflow.org> | 2018-04-18 13:18:22 -0700 |
commit | f28342c2caab42987e6761abeca84ba3147cddba (patch) | |
tree | 94a02cd32b804b16b7aa04544cde1652b0c7f58b /tensorflow/core/lib/strings/numbers.cc | |
parent | f4c6a318eb9eb01440c313a4fc423ac267fdb74e (diff) |
Prevent access to deallocated hash map upon exit().
PiperOrigin-RevId: 193404950
Diffstat (limited to 'tensorflow/core/lib/strings/numbers.cc')
-rw-r--r-- | tensorflow/core/lib/strings/numbers.cc | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/tensorflow/core/lib/strings/numbers.cc b/tensorflow/core/lib/strings/numbers.cc index 8f34baa7de..c296daa95d 100644 --- a/tensorflow/core/lib/strings/numbers.cc +++ b/tensorflow/core/lib/strings/numbers.cc @@ -34,18 +34,25 @@ namespace tensorflow { namespace { template <typename T> +const std::unordered_map<string, T>* GetSpecialNumsSingleton() { + static const std::unordered_map<string, T>* special_nums = + CHECK_NOTNULL((new const std::unordered_map<string, T>{ + {"inf", std::numeric_limits<T>::infinity()}, + {"+inf", std::numeric_limits<T>::infinity()}, + {"-inf", -std::numeric_limits<T>::infinity()}, + {"infinity", std::numeric_limits<T>::infinity()}, + {"+infinity", std::numeric_limits<T>::infinity()}, + {"-infinity", -std::numeric_limits<T>::infinity()}, + {"nan", std::numeric_limits<T>::quiet_NaN()}, + {"+nan", std::numeric_limits<T>::quiet_NaN()}, + {"-nan", -std::numeric_limits<T>::quiet_NaN()}, + })); + return special_nums; +} + +template <typename T> T locale_independent_strtonum(const char* str, const char** endptr) { - static const std::unordered_map<string, T> special_nums = { - {"inf", std::numeric_limits<T>::infinity()}, - {"+inf", std::numeric_limits<T>::infinity()}, - {"-inf", -std::numeric_limits<T>::infinity()}, - {"infinity", std::numeric_limits<T>::infinity()}, - {"+infinity", std::numeric_limits<T>::infinity()}, - {"-infinity", -std::numeric_limits<T>::infinity()}, - {"nan", std::numeric_limits<T>::quiet_NaN()}, - {"+nan", std::numeric_limits<T>::quiet_NaN()}, - {"-nan", -std::numeric_limits<T>::quiet_NaN()}, - }; + auto special_nums = GetSpecialNumsSingleton<T>(); std::stringstream s(str); // Check if str is one of the special numbers. @@ -57,8 +64,8 @@ T locale_independent_strtonum(const char* str, const char** endptr) { std::tolower(special_num_str[i], std::locale::classic()); } - auto entry = special_nums.find(special_num_str); - if (entry != special_nums.end()) { + auto entry = special_nums->find(special_num_str); + if (entry != special_nums->end()) { *endptr = str + (s.eof() ? static_cast<std::iostream::pos_type>(strlen(str)) : s.tellg()); return entry->second; |