From 46be53f14a5ce8737f0974b568af83be63959478 Mon Sep 17 00:00:00 2001 From: skv0zsneg Date: Sat, 28 Jun 2025 13:58:54 +0300 Subject: [PATCH 1/8] Fix UnboundLocalError for bytes payload and quoted-printable cte. --- Lib/email/message.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Lib/email/message.py b/Lib/email/message.py index 41fcc2b9778798..464b23de7bcf1c 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') + elif isinstance(payload, bytes): + bpayload = payload if cte == 'quoted-printable': return quopri.decodestring(bpayload) elif cte == 'base64': From 2d2906d8704174a39596bd53f1093704c9cf8fbe Mon Sep 17 00:00:00 2001 From: skv0zsneg Date: Sat, 28 Jun 2025 13:59:26 +0300 Subject: [PATCH 2/8] Add test for getting bytes payload with quoted-printable cte. --- Lib/test/test_email/test_message.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Lib/test/test_email/test_message.py b/Lib/test/test_email/test_message.py index 23c39775a8b2e5..9817f56efeedc3 100644 --- a/Lib/test/test_email/test_message.py +++ b/Lib/test/test_email/test_message.py @@ -1055,6 +1055,13 @@ 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): + payload = b'Some payload' + m = self._make_message() + m.add_header('Content-Transfer-Encoding', 'quoted-printable') + m._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 From 8ccd326cc490da95361099c552994881ded5ba85 Mon Sep 17 00:00:00 2001 From: skv0zsneg Date: Sat, 28 Jun 2025 14:13:22 +0300 Subject: [PATCH 3/8] Add myself to ACKS list. --- Misc/ACKS | 1 + 1 file changed, 1 insertion(+) diff --git a/Misc/ACKS b/Misc/ACKS index 6ab50763feadd9..043d4927e8eb10 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 From 2271433af466629a5e8638f611934b1000d1650f Mon Sep 17 00:00:00 2001 From: "blurb-it[bot]" <43283697+blurb-it[bot]@users.noreply.github.com> Date: Sat, 28 Jun 2025 11:32:58 +0000 Subject: [PATCH 4/8] =?UTF-8?q?=F0=9F=93=9C=F0=9F=A4=96=20Added=20by=20blu?= =?UTF-8?q?rb=5Fit.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../next/Library/2025-06-28-11-32-57.gh-issue-134759.AjjKcG.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 Misc/NEWS.d/next/Library/2025-06-28-11-32-57.gh-issue-134759.AjjKcG.rst 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..1d94f09df2f8ea --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-06-28-11-32-57.gh-issue-134759.AjjKcG.rst @@ -0,0 +1 @@ +Fix ``UnboundLocalError`` in ``email.message.Message.get_payload``. Patch by Kliment Lamonov. From e156408819d0ad3efe0e86409da8cb210ce37d63 Mon Sep 17 00:00:00 2001 From: skv0zsneg Date: Sat, 28 Jun 2025 14:38:56 +0300 Subject: [PATCH 5/8] Change elif statement to if --- Lib/email/message.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/email/message.py b/Lib/email/message.py index 464b23de7bcf1c..36e4b4a9f0b773 100644 --- a/Lib/email/message.py +++ b/Lib/email/message.py @@ -313,7 +313,7 @@ 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') - elif isinstance(payload, bytes): + else: bpayload = payload if cte == 'quoted-printable': return quopri.decodestring(bpayload) From 125a69a1d4b9079cb650ad8d08912d51587dc858 Mon Sep 17 00:00:00 2001 From: Kliment Lamonov Date: Sat, 28 Jun 2025 14:40:47 +0300 Subject: [PATCH 6/8] Update Misc/NEWS.d/next/Library/2025-06-28-11-32-57.gh-issue-134759.AjjKcG.rst MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- .../Library/2025-06-28-11-32-57.gh-issue-134759.AjjKcG.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 index 1d94f09df2f8ea..79b85320926954 100644 --- 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 @@ -1 +1,2 @@ -Fix ``UnboundLocalError`` in ``email.message.Message.get_payload``. Patch by Kliment Lamonov. +Fix :exc:`UnboundLocalError` in :func:`email.message.Message.get_payload` when +the payload to decode is a :class:`bytes` object. Patch by Kliment Lamonov. From af9dae0dbef10e9c7e9a10d42d0d7bdcf59a8fc7 Mon Sep 17 00:00:00 2001 From: skv0zsneg Date: Sun, 29 Jun 2025 15:22:54 +0300 Subject: [PATCH 7/8] Upd test for using public method. --- Lib/test/test_email/test_message.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_email/test_message.py b/Lib/test/test_email/test_message.py index 9817f56efeedc3..c116a7011f60d3 100644 --- a/Lib/test/test_email/test_message.py +++ b/Lib/test/test_email/test_message.py @@ -1056,10 +1056,10 @@ def test_get_body_malformed(self): m.get_body() def test_get_bytes_payload_with_quoted_printable_encoding(self): - payload = b'Some payload' + payload = memoryview(b'Some payload') m = self._make_message() m.add_header('Content-Transfer-Encoding', 'quoted-printable') - m._payload = payload + m.set_payload(payload) self.assertEqual(m.get_payload(decode=True), payload) From 62357014ed8083ea108bfca78896419205a5ef9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Sat, 12 Jul 2025 15:05:32 +0200 Subject: [PATCH 8/8] Update Lib/test/test_email/test_message.py --- Lib/test/test_email/test_message.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Lib/test/test_email/test_message.py b/Lib/test/test_email/test_message.py index c116a7011f60d3..b4128f70f18412 100644 --- a/Lib/test/test_email/test_message.py +++ b/Lib/test/test_email/test_message.py @@ -1056,6 +1056,8 @@ def test_get_body_malformed(self): 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') pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy