diff --git a/src/google/protobuf/util/json_util.cc b/src/google/protobuf/util/json_util.cc index ce3569cea2..e917ecc412 100644 --- a/src/google/protobuf/util/json_util.cc +++ b/src/google/protobuf/util/json_util.cc @@ -50,7 +50,8 @@ 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 25c7e96c0d..1395356b9b 100644 --- a/src/google/protobuf/util/json_util_test.cc +++ b/src/google/protobuf/util/json_util_test.cc @@ -40,6 +40,7 @@ #include #include #include +#include #include namespace google { @@ -457,6 +458,20 @@ TEST(ZeroCopyStreamByteSinkTest, TestAllInputOutputPatterns) { } } +TEST_F(JsonUtilTest, TestWronJsonInput) { + const char json[] = "{\"unknown_field\":\"some_value\"}"; + google::protobuf::io::ArrayInputStream input_stream(json, strlen(json)); + char protoBuffer[10000]; + google::protobuf::io::ArrayOutputStream output_stream(protoBuffer, sizeof(protoBuffer)); + const char *messageType = "type.googleapis.com/proto3.TestMessage"; + TypeResolver* resolver = NewTypeResolverForDescriptorPool("type.googleapis.com", DescriptorPool::generated_pool()); + + util::Status resultStatus = util::JsonToBinaryStream(resolver, messageType, &input_stream, &output_stream); + + EXPECT_FALSE(resultStatus.ok()); + EXPECT_EQ(resultStatus.error_code(), google::protobuf::util::error::INVALID_ARGUMENT); +} + } // namespace } // namespace util } // namespace protobuf