From 5db5c26ae4dffc7bae21c38d89b6c005d48474f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20Delalleau?= <21263019+gaeldelalleau@users.noreply.github.com> Date: Wed, 31 Jul 2019 23:52:53 +0200 Subject: [PATCH] Fix a Python extension crash in the descriptor's nested types container code (#6455) --- python/google/protobuf/internal/descriptor_test.py | 7 +++++++ python/google/protobuf/pyext/descriptor_containers.cc | 1 + 2 files changed, 8 insertions(+) diff --git a/python/google/protobuf/internal/descriptor_test.py b/python/google/protobuf/internal/descriptor_test.py index e753cbabd4..35d635e0b6 100755 --- a/python/google/protobuf/internal/descriptor_test.py +++ b/python/google/protobuf/internal/descriptor_test.py @@ -650,6 +650,13 @@ class GeneratedDescriptorTest(unittest.TestCase): del enum self.assertEqual('FOO', next(values_iter).name) + def testDescriptorNestedTypesContainer(self): + message_descriptor = unittest_pb2.TestAllTypes.DESCRIPTOR + nested_message_descriptor = unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR + self.assertEqual(len(message_descriptor.nested_types), 3) + self.assertFalse(None in message_descriptor.nested_types) + self.assertTrue(nested_message_descriptor in message_descriptor.nested_types) + def testServiceDescriptor(self): service_descriptor = unittest_pb2.DESCRIPTOR.services_by_name['TestService'] self.assertEqual(service_descriptor.name, 'TestService') diff --git a/python/google/protobuf/pyext/descriptor_containers.cc b/python/google/protobuf/pyext/descriptor_containers.cc index d5b5dc6817..8be8468164 100644 --- a/python/google/protobuf/pyext/descriptor_containers.cc +++ b/python/google/protobuf/pyext/descriptor_containers.cc @@ -639,6 +639,7 @@ int Find(PyContainer* self, PyObject* item) { // the .proto file definition. const void* descriptor_ptr = PyDescriptor_AsVoidPtr(item); if (descriptor_ptr == NULL) { + PyErr_Clear(); // Not a descriptor, it cannot be in the list. return -1; }