File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -668,6 +668,8 @@ def test_surrogatepass_handler(self):
668668 self .assertTrue (codecs .lookup_error ("surrogatepass" ))
669669 with self .assertRaises (UnicodeDecodeError ):
670670 b"abc\xed \xa0 " .decode ("utf-8" , "surrogatepass" )
671+ with self .assertRaises (UnicodeDecodeError ):
672+ b"abc\xed \xa0 z" .decode ("utf-8" , "surrogatepass" )
671673
672674@unittest .skipUnless (sys .platform == 'win32' ,
673675 'cp65001 is a Windows-only codec' )
Original file line number Diff line number Diff line change @@ -10,6 +10,9 @@ What's New in Python 3.4.0 Alpha 1?
1010Core and Builtins
1111-----------------
1212
13+ - Issue #16336: fix input checking in the surrogatepass error handler.
14+ Patch by Serhiy Storchaka.
15+
1316- Issue #8401: assigning an int to a bytearray slice (e.g. b[3:4] = 5) now
1417 raises an error.
1518
Original file line number Diff line number Diff line change @@ -791,10 +791,10 @@ PyCodec_SurrogatePassErrors(PyObject *exc)
791791 /* Try decoding a single surrogate character. If
792792 there are more, let the codec call us again. */
793793 p += start ;
794- if (strlen ( p ) > 2 &&
795- (( p [0 ] & 0xf0 ) == 0xe0 ||
796- (p [1 ] & 0xc0 ) == 0x80 ||
797- (p [2 ] & 0xc0 ) == 0x80 ) ) {
794+ if (PyBytes_GET_SIZE ( object ) - start >= 3 &&
795+ (p [0 ] & 0xf0 ) == 0xe0 &&
796+ (p [1 ] & 0xc0 ) == 0x80 &&
797+ (p [2 ] & 0xc0 ) == 0x80 ) {
798798 /* it's a three-byte code */
799799 ch = ((p [0 ] & 0x0f ) << 12 ) + ((p [1 ] & 0x3f ) << 6 ) + (p [2 ] & 0x3f );
800800 if (!Py_UNICODE_IS_SURROGATE (ch ))
You can’t perform that action at this time.
0 commit comments