aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJisi Liu <liujisi@google.com>2017-08-22 18:39:34 -0700
committerGitHub <noreply@github.com>2017-08-22 18:39:34 -0700
commitc44c3af2bcbb59fd2b2fd60b247429a2c19ec02b (patch)
tree60c2dfa7bb140617cddfdf11a7259039b0a627dc /src
parent7a431378317cb90fe701d56a633eca45dab40e94 (diff)
parent30681c757820bfdf063a41ad749f88552e21dcef (diff)
downloadprotobuf-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.cc38
-rw-r--r--src/google/protobuf/stubs/io_win32.cc30
-rw-r--r--src/google/protobuf/testing/googletest.h3
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