Skip to content

Commit e004c8b

Browse files
anandoleecopybara-github
authored andcommitted
Add reference leak check to Python timestamp_test and duration_test. Fix a refleak bug when assign datetime/duration to Timestamp/Duration
PiperOrigin-RevId: 758812845
1 parent c00072e commit e004c8b

File tree

4 files changed

+10
-4
lines changed

4 files changed

+10
-4
lines changed

python/google/protobuf/internal/duration_test.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@
1212
import unittest
1313

1414
from google.protobuf import duration
15+
from google.protobuf.internal import testing_refleaks
1516
from google.protobuf.internal import well_known_types_test_pb2
1617

1718
from google.protobuf import duration_pb2
1819

1920

21+
@testing_refleaks.TestCase
2022
class DurationTest(unittest.TestCase):
2123

2224
def test_duration_integer_conversion(self):

python/google/protobuf/internal/timestamp_test.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@
1212
import unittest
1313

1414
from google.protobuf import timestamp
15+
from google.protobuf.internal import testing_refleaks
1516
from google.protobuf.internal import well_known_types_test_pb2
1617

1718
from google.protobuf import timestamp_pb2
1819

1920

21+
@testing_refleaks.TestCase
2022
class TimestampTest(unittest.TestCase):
2123

2224
def test_timestamp_integer_conversion(self):

python/google/protobuf/pyext/message.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2641,11 +2641,11 @@ int SetFieldValue(CMessage* self, const FieldDescriptor* field_descriptor,
26412641
} else if (field_descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
26422642
if (field_descriptor->message_type()->well_known_type() !=
26432643
Descriptor::WELLKNOWNTYPE_UNSPECIFIED) {
2644-
PyObject* sub_message = GetFieldValue(self, field_descriptor);
2645-
if (PyObject_HasAttrString(sub_message, "_internal_assign")) {
2644+
ScopedPyObjectPtr sub_message(GetFieldValue(self, field_descriptor));
2645+
if (PyObject_HasAttrString(sub_message.get(), "_internal_assign")) {
26462646
AssureWritable(self);
2647-
ScopedPyObjectPtr ok(
2648-
PyObject_CallMethod(sub_message, "_internal_assign", "O", value));
2647+
ScopedPyObjectPtr ok(PyObject_CallMethod(
2648+
sub_message.get(), "_internal_assign", "O", value));
26492649
if (ok.get() == nullptr) {
26502650
return -1;
26512651
}

python/message.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -992,10 +992,12 @@ int PyUpb_Message_SetFieldValue(PyObject* _self, const upb_FieldDef* field,
992992
if (PyObject_HasAttrString(sub_message, "_internal_assign")) {
993993
PyObject* ok =
994994
PyObject_CallMethod(sub_message, "_internal_assign", "O", value);
995+
Py_DECREF(sub_message);
995996
if (!ok) return -1;
996997
Py_DECREF(ok);
997998
return 0;
998999
}
1000+
Py_DECREF(sub_message);
9991001
}
10001002
PyErr_Format(exc,
10011003
"Assignment not allowed to message "

0 commit comments

Comments
 (0)