Skip to content

Commit 8fa92e1

Browse files
committed
Add more error checking for codec result
1 parent dfc2103 commit 8fa92e1

File tree

2 files changed

+11
-2
lines changed

2 files changed

+11
-2
lines changed

graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unicode.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_center
2323
*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_codecs
2424
*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_codecs_charmap
25+
*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_codecs_errors
2526
*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_codecs_idna
2627
*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_codecs_utf7
2728
*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_codecs_utf8

graalpython/lib-graalpython/_codecs.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,11 @@ def encode(obj, encoding='utf-8', errors='strict'):
121121
result = encoder(obj, errors)
122122
if not (isinstance(result, tuple) and len(result) == 2):
123123
raise TypeError('encoder must return a tuple (object, integer)')
124-
return result[0]
124+
encoded = result[0]
125+
if not isinstance(encoded, bytes):
126+
raise TypeError("'%s' encoder returned '%s' instead of 'bytes'; use codecs.encode() to encode to arbitrary types"
127+
% (encoding, type(encoded).__name__))
128+
return encoded
125129

126130

127131
@__graalpython__.builtin
@@ -131,7 +135,11 @@ def decode(obj, encoding='utf-8', errors='strict'):
131135
result = decoder(obj, errors)
132136
if not (isinstance(result, tuple) and len(result) == 2):
133137
raise TypeError('decoder must return a tuple (object, integer)')
134-
return result[0]
138+
decoded = result[0]
139+
if not isinstance(decoded, str):
140+
raise TypeError("'%s' encoder returned '%s' instead of 'str'; use codecs.encode() to encode to arbitrary types"
141+
% (encoding, type(decoded).__name__))
142+
return decoded
135143

136144

137145
@__graalpython__.builtin

0 commit comments

Comments
 (0)