https://github.com/python/cpython/commit/c71ecd14188e6c158fee27a9c2ae75bf69f55f52
commit: c71ecd14188e6c158fee27a9c2ae75bf69f55f52
branch: 3.14
author: Miss Islington (bot) <[email protected]>
committer: picnixz <[email protected]>
date: 2025-07-12T13:56:10Z
summary:

[3.14] gh-134759: fix `UnboundLocalError` in 
`email.message.Message.get_payload` (GH-136071) (#136579)

gh-134759: fix `UnboundLocalError` in `email.message.Message.get_payload` 
(GH-136071)
(cherry picked from commit 25335d297b5248922a4c82183bcdf0c0ada8352b)

Co-authored-by: Kliment Lamonov <[email protected]>
Co-authored-by: Bénédikt Tran <[email protected]>

files:
A Misc/NEWS.d/next/Library/2025-06-28-11-32-57.gh-issue-134759.AjjKcG.rst
M Lib/email/message.py
M Lib/test/test_email/test_message.py
M Misc/ACKS

diff --git a/Lib/email/message.py b/Lib/email/message.py
index 41fcc2b9778798..36e4b4a9f0b773 100644
--- a/Lib/email/message.py
+++ b/Lib/email/message.py
@@ -313,6 +313,8 @@ def get_payload(self, i=None, decode=False):
                 # If it does happen, turn the string into bytes in a way
                 # guaranteed not to fail.
                 bpayload = payload.encode('raw-unicode-escape')
+        else:
+            bpayload = payload
         if cte == 'quoted-printable':
             return quopri.decodestring(bpayload)
         elif cte == 'base64':
diff --git a/Lib/test/test_email/test_message.py 
b/Lib/test/test_email/test_message.py
index 23c39775a8b2e5..b4128f70f18412 100644
--- a/Lib/test/test_email/test_message.py
+++ b/Lib/test/test_email/test_message.py
@@ -1055,6 +1055,15 @@ def test_get_body_malformed(self):
         # AttributeError: 'str' object has no attribute 'is_attachment'
         m.get_body()
 
+    def test_get_bytes_payload_with_quoted_printable_encoding(self):
+        # We use a memoryview to avoid directly changing the private payload
+        # and to prevent using the dedicated paths for string or bytes objects.
+        payload = memoryview(b'Some payload')
+        m = self._make_message()
+        m.add_header('Content-Transfer-Encoding', 'quoted-printable')
+        m.set_payload(payload)
+        self.assertEqual(m.get_payload(decode=True), payload)
+
 
 class TestMIMEPart(TestEmailMessageBase, TestEmailBase):
     # Doing the full test run here may seem a bit redundant, since the two
diff --git a/Misc/ACKS b/Misc/ACKS
index f80ae7d8fac461..83bc62726eecc9 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -1054,6 +1054,7 @@ Alexander Lakeev
 David Lam
 Thomas Lamb
 Valerie Lambert
+Kliment Lamonov
 Peter Lamut
 Jean-Baptiste "Jiba" Lamy
 Ronan Lamy
diff --git 
a/Misc/NEWS.d/next/Library/2025-06-28-11-32-57.gh-issue-134759.AjjKcG.rst 
b/Misc/NEWS.d/next/Library/2025-06-28-11-32-57.gh-issue-134759.AjjKcG.rst
new file mode 100644
index 00000000000000..79b85320926954
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-06-28-11-32-57.gh-issue-134759.AjjKcG.rst
@@ -0,0 +1,2 @@
+Fix :exc:`UnboundLocalError` in :func:`email.message.Message.get_payload` when
+the payload to decode is a :class:`bytes` object. Patch by Kliment Lamonov.

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to