diff options
author | Adam Cozzette <acozzette@gmail.com> | 2017-12-20 09:42:12 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-12-20 09:42:12 -0800 |
commit | 1e418e4e54625777e903ea65b2dd290d5432180b (patch) | |
tree | b8b77bfdd20f75d6c5b7ce2d6b01ff0be5e97f27 | |
parent | 860d693cf70f13d823ab8e6f9118d94485fa95bd (diff) | |
parent | ac1fdd163748077cf2a47919a2991cd5e128ff38 (diff) | |
download | protobuf-1e418e4e54625777e903ea65b2dd290d5432180b.tar.gz protobuf-1e418e4e54625777e903ea65b2dd290d5432180b.tar.bz2 protobuf-1e418e4e54625777e903ea65b2dd290d5432180b.zip |
Merge pull request #4068 from wsw2016/fix_4032
resolved issue 4032 and added a unit test
-rw-r--r-- | src/google/protobuf/util/json_util.cc | 4 | ||||
-rw-r--r-- | src/google/protobuf/util/json_util_test.cc | 24 |
2 files changed, 27 insertions, 1 deletions
diff --git a/src/google/protobuf/util/json_util.cc b/src/google/protobuf/util/json_util.cc index ce3569ce..25e78a65 100644 --- a/src/google/protobuf/util/json_util.cc +++ b/src/google/protobuf/util/json_util.cc @@ -50,7 +50,9 @@ namespace util { namespace internal { ZeroCopyStreamByteSink::~ZeroCopyStreamByteSink() { - stream_->BackUp(buffer_size_); + if (buffer_size_ > 0) { + stream_->BackUp(buffer_size_); + } } void ZeroCopyStreamByteSink::Append(const char* bytes, size_t len) { diff --git a/src/google/protobuf/util/json_util_test.cc b/src/google/protobuf/util/json_util_test.cc index 25c7e96c..5b714bb1 100644 --- a/src/google/protobuf/util/json_util_test.cc +++ b/src/google/protobuf/util/json_util_test.cc @@ -40,6 +40,7 @@ #include <google/protobuf/util/json_format_proto3.pb.h> #include <google/protobuf/util/type_resolver.h> #include <google/protobuf/util/type_resolver_util.h> +#include <google/protobuf/io/zero_copy_stream_impl.h> #include <gtest/gtest.h> namespace google { @@ -457,6 +458,29 @@ TEST(ZeroCopyStreamByteSinkTest, TestAllInputOutputPatterns) { } } +TEST_F(JsonUtilTest, TestWrongJsonInput) { + using namespace google::protobuf; + const char json[] = "{\"unknown_field\":\"some_value\"}"; + io::ArrayInputStream input_stream(json, strlen(json)); + char proto_buffer[10000]; + io::ArrayOutputStream output_stream(proto_buffer, sizeof(proto_buffer)); + std::string message_type = "type.googleapis.com/proto3.TestMessage"; + TypeResolver* resolver = NewTypeResolverForDescriptorPool( + "type.googleapis.com", + DescriptorPool::generated_pool()); + + util::Status result_status = util::JsonToBinaryStream(resolver, + message_type, + &input_stream, + &output_stream); + + delete resolver; + + EXPECT_FALSE(result_status.ok()); + EXPECT_EQ(result_status.error_code(), + google::protobuf::util::error::INVALID_ARGUMENT); +} + } // namespace } // namespace util } // namespace protobuf |