diff options
author | Jisi Liu <liujisi@google.com> | 2017-08-22 18:39:34 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-08-22 18:39:34 -0700 |
commit | c44c3af2bcbb59fd2b2fd60b247429a2c19ec02b (patch) | |
tree | 60c2dfa7bb140617cddfdf11a7259039b0a627dc /src | |
parent | 7a431378317cb90fe701d56a633eca45dab40e94 (diff) | |
parent | 30681c757820bfdf063a41ad749f88552e21dcef (diff) | |
download | protobuf-c44c3af2bcbb59fd2b2fd60b247429a2c19ec02b.tar.gz protobuf-c44c3af2bcbb59fd2b2fd60b247429a2c19ec02b.tar.bz2 protobuf-c44c3af2bcbb59fd2b2fd60b247429a2c19ec02b.zip |
Merge pull request #3548 from google/3.4.x
Merge fixes from 3.4.x into master
Diffstat (limited to 'src')
-rw-r--r-- | src/google/protobuf/message_unittest.cc | 38 | ||||
-rw-r--r-- | src/google/protobuf/stubs/io_win32.cc | 30 | ||||
-rw-r--r-- | src/google/protobuf/testing/googletest.h | 3 |
3 files changed, 17 insertions, 54 deletions
diff --git a/src/google/protobuf/message_unittest.cc b/src/google/protobuf/message_unittest.cc index fe456677..06a7f65c 100644 --- a/src/google/protobuf/message_unittest.cc +++ b/src/google/protobuf/message_unittest.cc @@ -257,44 +257,6 @@ TEST(MessageTest, CheckInitialized) { "fields: a, b, c"); } -TEST(MessageTest, CheckOverflow) { - unittest::TestAllTypes message; - // Create a message with size just over 2GB. This triggers integer overflow - // when computing message size. - const string data(1024, 'x'); - Cord one_megabyte; - for (int i = 0; i < 1024; i++) { - one_megabyte.Append(data); - } - - for (int i = 0; i < 2 * 1024 + 1; ++i) { - message.add_repeated_cord()->CopyFrom(one_megabyte); - } - - Cord serialized; - EXPECT_FALSE(message.AppendToCord(&serialized)); -} - -TEST(MessageTest, CheckBigOverflow) { - // Checking for 4GB buffers on 32 bit systems is problematic. - if (sizeof(void*) < 8) return; - unittest::TestAllTypes message; - // Create a message with size just over 4GB. We should be able to detect this - // too, even though it will make a plain "int" wrap back to a positive number. - const string data(1024, 'x'); - Cord one_megabyte; - for (int i = 0; i < 1024; i++) { - one_megabyte.Append(data); - } - - for (int i = 0; i < 4 * 1024 + 1; ++i) { - message.add_repeated_cord()->CopyFrom(one_megabyte); - } - - Cord serialized; - EXPECT_FALSE(message.AppendToCord(&serialized)); -} - #endif // PROTOBUF_HAS_DEATH_TEST namespace { diff --git a/src/google/protobuf/stubs/io_win32.cc b/src/google/protobuf/stubs/io_win32.cc index b418986b..51656a78 100644 --- a/src/google/protobuf/stubs/io_win32.cc +++ b/src/google/protobuf/stubs/io_win32.cc @@ -57,6 +57,7 @@ #include <windows.h> #include <google/protobuf/stubs/io_win32.h> +#include <google/protobuf/stubs/scoped_ptr.h> #include <cassert> #include <memory> @@ -71,7 +72,6 @@ namespace win32 { namespace { using std::string; -using std::unique_ptr; using std::wstring; template <typename char_type> @@ -139,11 +139,11 @@ string join_paths(const string& path1, const string& path2) { return path1; } - if (is_separator(path1.back())) { - return is_separator(path2.front()) ? (path1 + path2.substr(1)) + if (is_separator(path1[path1.size() - 1])) { + return is_separator(path2[0]) ? (path1 + path2.substr(1)) : (path1 + path2); } else { - return is_separator(path2.front()) ? (path1 + path2) + return is_separator(path2[0]) ? (path1 + path2) : (path1 + '\\' + path2); } } @@ -203,24 +203,24 @@ string normalize(string path) { result << s; } // Preserve trailing separator if the input contained it. - if (is_separator(path.back())) { + if (!path.empty() && is_separator(path[path.size() - 1])) { result << '\\'; } return result.str(); } -std::unique_ptr<WCHAR[]> as_wstring(const string& s) { +WCHAR* as_wstring(const string& s) { int len = ::MultiByteToWideChar(CP_UTF8, 0, s.c_str(), s.size(), NULL, 0); - std::unique_ptr<WCHAR[]> result(new WCHAR[len + 1]); - ::MultiByteToWideChar(CP_UTF8, 0, s.c_str(), s.size(), result.get(), len + 1); - result.get()[len] = 0; - return std::move(result); + WCHAR* result = new WCHAR[len + 1]; + ::MultiByteToWideChar(CP_UTF8, 0, s.c_str(), s.size(), result, len + 1); + result[len] = 0; + return result; } -wstring as_wchar_path(const string& path) { - std::unique_ptr<WCHAR[]> wbuf(as_wstring(path)); +void as_wchar_path(const string& path, wstring* wchar_path) { + scoped_array<WCHAR> wbuf(as_wstring(path)); replace_directory_separators(wbuf.get()); - return wstring(wbuf.get()); + wchar_path->assign(wbuf.get()); } bool as_windows_path(const string& path, wstring* result) { @@ -239,7 +239,7 @@ bool as_windows_path(const string& path, wstring* result) { ::GetCurrentDirectoryA(MAX_PATH, cwd); mutable_path = join_paths(cwd, mutable_path); } - *result = as_wchar_path(normalize(mutable_path)); + as_wchar_path(normalize(mutable_path), result); if (!has_longpath_prefix(result->c_str())) { // Add the "\\?\" prefix unconditionally. This way we prevent the Win32 API // from processing the path and "helpfully" removing trailing dots from the @@ -324,7 +324,7 @@ FILE* fopen(const char* path, const char* mode) { errno = ENOENT; return NULL; } - std::unique_ptr<WCHAR[]> wmode(as_wstring(mode)); + scoped_array<WCHAR> wmode(as_wstring(mode)); return ::_wfopen(wpath.c_str(), wmode.get()); #else return ::fopen(path, mode); diff --git a/src/google/protobuf/testing/googletest.h b/src/google/protobuf/testing/googletest.h index dc4401d0..2db3bfee 100644 --- a/src/google/protobuf/testing/googletest.h +++ b/src/google/protobuf/testing/googletest.h @@ -39,7 +39,8 @@ #include <google/protobuf/stubs/common.h> #include <gmock/gmock.h> // Disable death tests if we use exceptions in CHECK(). -#if !PROTOBUF_USE_EXCEPTIONS && defined(GTEST_HAS_DEATH_TEST) +#if !PROTOBUF_USE_EXCEPTIONS && defined(GTEST_HAS_DEATH_TEST) && \ + !GTEST_OS_WINDOWS #define PROTOBUF_HAS_DEATH_TEST #endif |