From f28342c2caab42987e6761abeca84ba3147cddba Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 18 Apr 2018 13:13:02 -0700 Subject: Prevent access to deallocated hash map upon exit(). PiperOrigin-RevId: 193404950 --- tensorflow/core/lib/strings/numbers.cc | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) (limited to 'tensorflow/core/lib/strings/numbers.cc') 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 @@ -33,19 +33,26 @@ namespace tensorflow { namespace { +template +const std::unordered_map* GetSpecialNumsSingleton() { + static const std::unordered_map* special_nums = + CHECK_NOTNULL((new const std::unordered_map{ + {"inf", std::numeric_limits::infinity()}, + {"+inf", std::numeric_limits::infinity()}, + {"-inf", -std::numeric_limits::infinity()}, + {"infinity", std::numeric_limits::infinity()}, + {"+infinity", std::numeric_limits::infinity()}, + {"-infinity", -std::numeric_limits::infinity()}, + {"nan", std::numeric_limits::quiet_NaN()}, + {"+nan", std::numeric_limits::quiet_NaN()}, + {"-nan", -std::numeric_limits::quiet_NaN()}, + })); + return special_nums; +} + template T locale_independent_strtonum(const char* str, const char** endptr) { - static const std::unordered_map special_nums = { - {"inf", std::numeric_limits::infinity()}, - {"+inf", std::numeric_limits::infinity()}, - {"-inf", -std::numeric_limits::infinity()}, - {"infinity", std::numeric_limits::infinity()}, - {"+infinity", std::numeric_limits::infinity()}, - {"-infinity", -std::numeric_limits::infinity()}, - {"nan", std::numeric_limits::quiet_NaN()}, - {"+nan", std::numeric_limits::quiet_NaN()}, - {"-nan", -std::numeric_limits::quiet_NaN()}, - }; + auto special_nums = GetSpecialNumsSingleton(); 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(strlen(str)) : s.tellg()); return entry->second; -- cgit v1.2.3