make bytearray work (again) (#16691)

fix is pretty simple, just check if the type is bytearray and get the bytes if it is

addresses issue: https://github.com/protocolbuffers/protobuf/issues/15911

Closes #16691

COPYBARA_INTEGRATE_REVIEW=https://github.com/protocolbuffers/protobuf/pull/16691 from jensbjorgensen:main 6249e629d7db2f8ee900917798c97fb704abf4a2
PiperOrigin-RevId: 642623917
diff --git a/python/google/protobuf/internal/message_test.py b/python/google/protobuf/internal/message_test.py
index f25cf2a..bf91424 100755
--- a/python/google/protobuf/internal/message_test.py
+++ b/python/google/protobuf/internal/message_test.py
@@ -82,6 +82,19 @@
     golden_copy = copy.deepcopy(golden_message)
     self.assertEqual(golden_data, golden_copy.SerializeToString())
 
+  def testGoldenMessageBytearray(self, message_module):
+    # bytearray was broken, test that it works again
+    if message_module is unittest_pb2:
+      golden_data = test_util.GoldenFileData('golden_message_oneof_implemented')
+    else:
+      golden_data = test_util.GoldenFileData('golden_message_proto3')
+
+    golden_message = message_module.TestAllTypes()
+    golden_message.ParseFromString(bytearray(golden_data))
+    if message_module is unittest_pb2:
+      test_util.ExpectAllFieldsSet(self, golden_message)
+    self.assertEqual(golden_data, golden_message.SerializeToString())
+
   def testGoldenPackedMessage(self, message_module):
     golden_data = test_util.GoldenFileData('golden_packed_fields_message')
     golden_message = message_module.TestPackedTypes()
diff --git a/python/message.c b/python/message.c
index 8d91b0f..327eb2e 100644
--- a/python/message.c
+++ b/python/message.c
@@ -1329,6 +1329,9 @@
     int err = PyBytes_AsStringAndSize(bytes, &buf, &size);
     (void)err;
     assert(err >= 0);
+  } else if (PyByteArray_Check(arg)) {
+    buf = PyByteArray_AS_STRING(arg);
+    size = PyByteArray_GET_SIZE(arg);
   } else if (PyBytes_AsStringAndSize(arg, &buf, &size) < 0) {
     return NULL;
   }