From b32c2a80e034e6132128bf12c6659c32cdcc786d Mon Sep 17 00:00:00 2001 From: Jeffrey Quesnelle Date: Thu, 7 Dec 2017 16:30:24 -0500 Subject: fix undefined behavior in C++03 --- src/google/protobuf/stubs/io_win32.cc | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'src/google/protobuf/stubs') diff --git a/src/google/protobuf/stubs/io_win32.cc b/src/google/protobuf/stubs/io_win32.cc index fa2cb8b1..c81b1e2a 100644 --- a/src/google/protobuf/stubs/io_win32.cc +++ b/src/google/protobuf/stubs/io_win32.cc @@ -155,12 +155,13 @@ string normalize(string path) { static const string dot("."); static const string dotdot(".."); + const string& cpath = path; std::vector segments; int segment_start = -1; // Find the path segments in `path` (separated by "/"). for (int i = 0;; ++i) { - if (!is_separator(path[i]) && path[i] != '\0') { + if (!is_separator(cpath[i]) && cpath[i] != '\0') { // The current character does not end a segment, so start one unless it's // already started. if (segment_start < 0) { @@ -169,7 +170,7 @@ string normalize(string path) { } else if (segment_start >= 0 && i > segment_start) { // The current character is "/" or "\0", so this ends a segment. // Add that to `segments` if there's anything to add; handle "." and "..". - string segment(path, segment_start, i - segment_start); + string segment(cpath, segment_start, i - segment_start); segment_start = -1; if (segment == dotdot) { if (!segments.empty() && @@ -180,7 +181,7 @@ string normalize(string path) { segments.push_back(segment); } } - if (path[i] == '\0') { + if (cpath[i] == '\0') { break; } } @@ -203,7 +204,7 @@ string normalize(string path) { result << segments[i]; } // Preserve trailing separator if the input contained it. - if (!path.empty() && is_separator(path[path.size() - 1])) { + if (!cpath.empty() && is_separator(cpath[cpath.size() - 1])) { result << '\\'; } return result.str(); -- cgit v1.2.3 From f5b086273aa2f5832f72e6b2aa755c0930dfaffa Mon Sep 17 00:00:00 2001 From: Jeffrey Quesnelle Date: Thu, 7 Dec 2017 19:02:35 -0500 Subject: use const char* instead of const std::string& in normalize() --- src/google/protobuf/stubs/io_win32.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src/google/protobuf/stubs') diff --git a/src/google/protobuf/stubs/io_win32.cc b/src/google/protobuf/stubs/io_win32.cc index c81b1e2a..2b8a8a22 100644 --- a/src/google/protobuf/stubs/io_win32.cc +++ b/src/google/protobuf/stubs/io_win32.cc @@ -155,13 +155,13 @@ string normalize(string path) { static const string dot("."); static const string dotdot(".."); - const string& cpath = path; + const char *p = path.c_str(); std::vector segments; int segment_start = -1; // Find the path segments in `path` (separated by "/"). for (int i = 0;; ++i) { - if (!is_separator(cpath[i]) && cpath[i] != '\0') { + if (!is_separator(p[i]) && p[i] != '\0') { // The current character does not end a segment, so start one unless it's // already started. if (segment_start < 0) { @@ -170,7 +170,7 @@ string normalize(string path) { } else if (segment_start >= 0 && i > segment_start) { // The current character is "/" or "\0", so this ends a segment. // Add that to `segments` if there's anything to add; handle "." and "..". - string segment(cpath, segment_start, i - segment_start); + string segment(p, segment_start, i - segment_start); segment_start = -1; if (segment == dotdot) { if (!segments.empty() && @@ -181,7 +181,7 @@ string normalize(string path) { segments.push_back(segment); } } - if (cpath[i] == '\0') { + if (p[i] == '\0') { break; } } @@ -204,7 +204,7 @@ string normalize(string path) { result << segments[i]; } // Preserve trailing separator if the input contained it. - if (!cpath.empty() && is_separator(cpath[cpath.size() - 1])) { + if (!path.empty() && is_separator(p[path.size() - 1])) { result << '\\'; } return result.str(); -- cgit v1.2.3