소스 검색

Merge pull request #4068 from wsw2016/fix_4032

resolved issue 4032 and added a unit test
Adam Cozzette 7 년 전
부모
커밋
1e418e4e54
2개의 변경된 파일27개의 추가작업 그리고 1개의 파일을 삭제
  1. 3 1
      src/google/protobuf/util/json_util.cc
  2. 24 0
      src/google/protobuf/util/json_util_test.cc

+ 3 - 1
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) {

+ 24 - 0
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