diff options
-rwxr-xr-x | python/google/protobuf/internal/containers.py | 4 | ||||
-rwxr-xr-x | python/google/protobuf/internal/message_test.py | 16 | ||||
-rw-r--r-- | src/google/protobuf/stubs/platform_macros.h | 3 | ||||
-rw-r--r-- | src/google/protobuf/util/json_util.cc | 4 | ||||
-rw-r--r-- | src/google/protobuf/util/json_util_test.cc | 24 |
5 files changed, 37 insertions, 14 deletions
diff --git a/python/google/protobuf/internal/containers.py b/python/google/protobuf/internal/containers.py index 68be9e54..c6a3692a 100755 --- a/python/google/protobuf/internal/containers.py +++ b/python/google/protobuf/internal/containers.py @@ -549,10 +549,10 @@ class MessageMap(MutableMapping): self._values = {} def __getitem__(self, key): + key = self._key_checker.CheckValue(key) try: return self._values[key] except KeyError: - key = self._key_checker.CheckValue(key) new_element = self._message_descriptor._concrete_class() new_element._SetListener(self._message_listener) self._values[key] = new_element @@ -584,12 +584,14 @@ class MessageMap(MutableMapping): return default def __contains__(self, item): + item = self._key_checker.CheckValue(item) return item in self._values def __setitem__(self, key, value): raise ValueError('May not set values directly, call my_map[key].foo = 5') def __delitem__(self, key): + key = self._key_checker.CheckValue(key) del self._values[key] self._message_listener.Modified() diff --git a/python/google/protobuf/internal/message_test.py b/python/google/protobuf/internal/message_test.py index a303b1aa..8dae6377 100755 --- a/python/google/protobuf/internal/message_test.py +++ b/python/google/protobuf/internal/message_test.py @@ -1480,12 +1480,8 @@ class Proto3Test(BaseTestCase): submsg = msg.map_int32_foreign_message[5] self.assertIs(submsg, msg.map_int32_foreign_message.get(5)) - # TODO(jieluo): Fix python and cpp extension diff. - if api_implementation.Type() == 'cpp': - with self.assertRaises(TypeError): - msg.map_int32_foreign_message.get('') - else: - self.assertEqual(None, msg.map_int32_foreign_message.get('')) + with self.assertRaises(TypeError): + msg.map_int32_foreign_message.get('') def testScalarMap(self): msg = map_unittest_pb2.TestMap() @@ -1695,12 +1691,8 @@ class Proto3Test(BaseTestCase): del msg2.map_int32_foreign_message[222] self.assertFalse(222 in msg2.map_int32_foreign_message) - if api_implementation.Type() == 'cpp': - with self.assertRaises(TypeError): - del msg2.map_int32_foreign_message[''] - else: - with self.assertRaises(KeyError): - del msg2.map_int32_foreign_message[''] + with self.assertRaises(TypeError): + del msg2.map_int32_foreign_message[''] def testMergeFromBadType(self): msg = map_unittest_pb2.TestMap() diff --git a/src/google/protobuf/stubs/platform_macros.h b/src/google/protobuf/stubs/platform_macros.h index 7a54060d..c3a64dd2 100644 --- a/src/google/protobuf/stubs/platform_macros.h +++ b/src/google/protobuf/stubs/platform_macros.h @@ -50,6 +50,9 @@ #elif defined(_M_ARM) || defined(__ARMEL__) #define GOOGLE_PROTOBUF_ARCH_ARM 1 #define GOOGLE_PROTOBUF_ARCH_32_BIT 1 +#elif defined(_M_ARM64) +#define GOOGLE_PROTOBUF_ARCH_ARM 1 +#define GOOGLE_PROTOBUF_ARCH_64_BIT 1 #elif defined(__aarch64__) #define GOOGLE_PROTOBUF_ARCH_AARCH64 1 #define GOOGLE_PROTOBUF_ARCH_64_BIT 1 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 |