diff options
| author | lioncash <mathew1800@gmail.com> | 2014-09-05 14:34:46 -0400 |
|---|---|---|
| committer | lioncash <mathew1800@gmail.com> | 2014-09-05 15:12:17 -0400 |
| commit | 3e0c04a83e99847e5e846ce8c198bb8a5d26343f (patch) | |
| tree | 5ec2cc92a07a800a7a9ed82926df7a0c51c6deae /Source/Core/Common/StringUtil.cpp | |
| parent | 0576046fdd6bccc61b30174f04207b5191280f6f (diff) | |
Common: Fix a potential infinite loop in ReplaceAll
Prior to this change, it was possible to cause an infinite loop by making the string to be replaced and the replacing string the same thing.
e.g.
std::string some_str = "test";
ReplaceAll(some_str, "test", "test");
This also changes the replacing in a way that doesn't require starting from the beginning of the string on each replacement iteration.
Diffstat (limited to 'Source/Core/Common/StringUtil.cpp')
| -rw-r--r-- | Source/Core/Common/StringUtil.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/Source/Core/Common/StringUtil.cpp b/Source/Core/Common/StringUtil.cpp index 3239628b62..91d451a03f 100644 --- a/Source/Core/Common/StringUtil.cpp +++ b/Source/Core/Common/StringUtil.cpp @@ -281,12 +281,17 @@ std::string TabsToSpaces(int tab_size, const std::string &in) std::string ReplaceAll(std::string result, const std::string& src, const std::string& dest) { - while (1) + size_t pos = 0; + + if (src == dest) + return result; + + while ((pos = result.find(src, pos)) != std::string::npos) { - size_t pos = result.find(src); - if (pos == std::string::npos) break; result.replace(pos, src.size(), dest); + pos += dest.length(); } + return result; } |
