]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.13] gh-134151 Fix `TypeError` in `email.utils.decode_params` when sorting RFC...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Sun, 8 Jun 2025 07:38:00 +0000 (09:38 +0200)
committerGitHub <noreply@github.com>
Sun, 8 Jun 2025 07:38:00 +0000 (07:38 +0000)
gh-134151 Fix `TypeError` in `email.utils.decode_params` when sorting RFC 2231 continuations (GH-134687)

- Fix sorting logic in `email.utils.decode_params` to handle None values.
- Update tests for RFC 2231 continuation sorting.
(cherry picked from commit bcb6b45cb86a2f9f65b6c41f27c36059ba86a50b)

Co-authored-by: Jiucheng(Oliver) <git.jiucheng@gmail.com>
Lib/email/utils.py
Lib/test/test_email/test_email.py
Misc/NEWS.d/next/Library/2025-05-25-23-23-05.gh-issue-134151.13Wwsb.rst [new file with mode: 0644]

index e42674fa4f3b75c6354151f638b0e22e9896045b..e4d35f06abcc09f17a0d60d0e82f19a18c8596c6 100644 (file)
@@ -417,8 +417,14 @@ def decode_params(params):
         for name, continuations in rfc2231_params.items():
             value = []
             extended = False
-            # Sort by number
-            continuations.sort()
+            # Sort by number, treating None as 0 if there is no 0,
+            # and ignore it if there is already a 0.
+            has_zero = any(x[0] == 0 for x in continuations)
+            if has_zero:
+                continuations = [x for x in continuations if x[0] is not None]
+            else:
+                continuations = [(x[0] or 0, x[1], x[2]) for x in continuations]
+            continuations.sort(key=lambda x: x[0])
             # And now append all values in numerical order, converting
             # %-encodings for the encoded segments.  If any of the
             # continuation names ends in a *, then the entire string, after
index bbb0102c5018a9c7215efdfbae9d77f7a0174b2b..5d50eef31a74bdc17208a96e3bf5e1a7fcc9ccc7 100644 (file)
@@ -389,6 +389,24 @@ class TestMessageAPI(TestEmailBase):
         msg = email.message_from_string("Content-Type: blarg; baz; boo\n")
         self.assertEqual(msg.get_param('baz'), '')
 
+    def test_continuation_sorting_part_order(self):
+        msg = email.message_from_string(
+            "Content-Disposition: attachment; "
+            "filename*=\"ignored\"; "
+            "filename*0*=\"utf-8''foo%20\"; "
+            "filename*1*=\"bar.txt\"\n"
+        )
+        filename = msg.get_filename()
+        self.assertEqual(filename, 'foo bar.txt')
+
+    def test_sorting_no_continuations(self):
+        msg = email.message_from_string(
+            "Content-Disposition: attachment; "
+            "filename*=\"bar.txt\"; "
+        )
+        filename = msg.get_filename()
+        self.assertEqual(filename, 'bar.txt')
+
     def test_missing_filename(self):
         msg = email.message_from_string("From: foo\n")
         self.assertEqual(msg.get_filename(), None)
diff --git a/Misc/NEWS.d/next/Library/2025-05-25-23-23-05.gh-issue-134151.13Wwsb.rst b/Misc/NEWS.d/next/Library/2025-05-25-23-23-05.gh-issue-134151.13Wwsb.rst
new file mode 100644 (file)
index 0000000..ecdde24
--- /dev/null
@@ -0,0 +1,2 @@
+:mod:`email`: Fix :exc:`TypeError` in :func:`email.utils.decode_params`
+when sorting :rfc:`2231` continuations that contain an unnumbered section.