Skip to content

gh-87112: Ensure that only digits convertible to integers are accepted as section number in MIME header parameter #136877

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
Prev Previous commit
Next Next commit
Accept digits that are convertible to int for backwards compatibility
  • Loading branch information
matthieucan committed Jul 27, 2025
commit f12e424b92a0722258b85c6553ad9e94e218155c
20 changes: 15 additions & 5 deletions Lib/email/_header_value_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -2398,21 +2398,31 @@ def get_section(value):
The caller should already have dealt with leading CFWS.

"""
def is_ascii_digit(d):
# We don't use str.isdigit because only ASCII digits are allowed.
return '0' <= d <= '9'
def is_accepted_digit(d):
# While only ASCII digits are allowed by the RFC, we accept any digit
# that can be converted to an int for backwards compatibility purposes.
# We don't use str.isdigit() as some Unicode digits are not convertible
# (e.g. superscript digits).
try:
int(d)
return True
except ValueError:
return False

section = Section()
if not value or value[0] != '*':
raise errors.HeaderParseError("Expected section but found {}".format(
value))
section.append(ValueTerminal('*', 'section-marker'))
value = value[1:]
if not value or not is_ascii_digit(value[0]):
if not value or not is_accepted_digit(value[0]):
raise errors.HeaderParseError("Expected section number but "
"found {}".format(value))
digits = ''
while value and is_ascii_digit(value[0]):
while value and is_accepted_digit(value[0]):
if not '0' <= value[0] <= '9':
section.defects.append(errors.InvalidHeaderDefect(
"section number has a non-ASCII digit {}".format(value[0])))
digits += value[0]
value = value[1:]
if digits[0] == '0' and digits != '0':
Expand Down
11 changes: 9 additions & 2 deletions Lib/test/test_email/test__header_value_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -2983,13 +2983,20 @@ def mime_parameters_as_value(self,
[('r', '"')],
[errors.InvalidHeaderDefect]*2),

# gh-87112: Only ASCII digits can be section numbers.
'non_allowed_digits': (
# gh-87112: Only digits convertible to integers can be section numbers.
'non_accepted_digit': (
'foo*0=bar; foo*²=baz',
' foo="bar"',
'foo*0=bar; foo*²=baz',
[('foo', 'bar')],
[errors.InvalidHeaderDefect]),

'non_ascii_digit_backwards_compatibility': (
'foo*0=bar; foo*߁=baz', # NKO digit '1'
' foo="barbaz"',
'foo*0=bar; foo*߁=baz',
[('foo', 'barbaz')],
[errors.InvalidHeaderDefect]),
}

@parameterize
Expand Down
Loading
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