@@ -39,23 +39,21 @@ def nameprep(label):
39
39
40
40
# Check bidi
41
41
RandAL = [stringprep .in_table_d1 (x ) for x in label ]
42
- for c in RandAL :
43
- if c :
44
- # There is a RandAL char in the string. Must perform further
45
- # tests:
46
- # 1) The characters in section 5.8 MUST be prohibited.
47
- # This is table C.8, which was already checked
48
- # 2) If a string contains any RandALCat character, the string
49
- # MUST NOT contain any LCat character.
50
- if any (stringprep .in_table_d2 (x ) for x in label ):
51
- raise UnicodeError ("Violation of BIDI requirement 2" )
52
-
53
- # 3) If a string contains any RandALCat character, a
54
- # RandALCat character MUST be the first character of the
55
- # string, and a RandALCat character MUST be the last
56
- # character of the string.
57
- if not RandAL [0 ] or not RandAL [- 1 ]:
58
- raise UnicodeError ("Violation of BIDI requirement 3" )
42
+ if any (RandAL ):
43
+ # There is a RandAL char in the string. Must perform further
44
+ # tests:
45
+ # 1) The characters in section 5.8 MUST be prohibited.
46
+ # This is table C.8, which was already checked
47
+ # 2) If a string contains any RandALCat character, the string
48
+ # MUST NOT contain any LCat character.
49
+ if any (stringprep .in_table_d2 (x ) for x in label ):
50
+ raise UnicodeError ("Violation of BIDI requirement 2" )
51
+ # 3) If a string contains any RandALCat character, a
52
+ # RandALCat character MUST be the first character of the
53
+ # string, and a RandALCat character MUST be the last
54
+ # character of the string.
55
+ if not RandAL [0 ] or not RandAL [- 1 ]:
56
+ raise UnicodeError ("Violation of BIDI requirement 3" )
59
57
60
58
return label
61
59
@@ -103,6 +101,16 @@ def ToASCII(label):
103
101
raise UnicodeError ("label empty or too long" )
104
102
105
103
def ToUnicode (label ):
104
+ if len (label ) > 1024 :
105
+ # Protection from https://github.com/python/cpython/issues/98433.
106
+ # https://datatracker.ietf.org/doc/html/rfc5894#section-6
107
+ # doesn't specify a label size limit prior to NAMEPREP. But having
108
+ # one makes practical sense.
109
+ # This leaves ample room for nameprep() to remove Nothing characters
110
+ # per https://www.rfc-editor.org/rfc/rfc3454#section-3.1 while still
111
+ # preventing us from wasting time decoding a big thing that'll just
112
+ # hit the actual <= 63 length limit in Step 6.
113
+ raise UnicodeError ("label way too long" )
106
114
# Step 1: Check for ASCII
107
115
if isinstance (label , bytes ):
108
116
pure_ascii = True
0 commit comments