mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 21:51:50 +00:00 
			
		
		
		
	Issue #16975: Fix error handling bug in the escape-decode bytes decoder.
This commit is contained in:
		
							parent
							
								
									697e56d0f5
								
							
						
					
					
						commit
						ace3ad3bf7
					
				
					 3 changed files with 50 additions and 0 deletions
				
			
		|  | @ -805,6 +805,50 @@ class EscapeDecodeTest(unittest.TestCase): | ||||||
|     def test_empty(self): |     def test_empty(self): | ||||||
|         self.assertEqual(codecs.escape_decode(""), (b"", 0)) |         self.assertEqual(codecs.escape_decode(""), (b"", 0)) | ||||||
| 
 | 
 | ||||||
|  |     def test_raw(self): | ||||||
|  |         for b in range(256): | ||||||
|  |             if b != b'\\'[0]: | ||||||
|  |                 self.assertEqual(codecs.escape_decode(bytes([b]) + b'0'), | ||||||
|  |                                  (bytes([b]) + b'0', 2)) | ||||||
|  | 
 | ||||||
|  |     def test_escape(self): | ||||||
|  |         self.assertEqual(codecs.escape_decode(b"[\\\n]"), (b"[]", 4)) | ||||||
|  |         self.assertEqual(codecs.escape_decode(br'[\"]'), (b'["]', 4)) | ||||||
|  |         self.assertEqual(codecs.escape_decode(br"[\']"), (b"[']", 4)) | ||||||
|  |         self.assertEqual(codecs.escape_decode(br"[\\]"), (br"[\]", 4)) | ||||||
|  |         self.assertEqual(codecs.escape_decode(br"[\a]"), (b"[\x07]", 4)) | ||||||
|  |         self.assertEqual(codecs.escape_decode(br"[\b]"), (b"[\x08]", 4)) | ||||||
|  |         self.assertEqual(codecs.escape_decode(br"[\t]"), (b"[\x09]", 4)) | ||||||
|  |         self.assertEqual(codecs.escape_decode(br"[\n]"), (b"[\x0a]", 4)) | ||||||
|  |         self.assertEqual(codecs.escape_decode(br"[\v]"), (b"[\x0b]", 4)) | ||||||
|  |         self.assertEqual(codecs.escape_decode(br"[\f]"), (b"[\x0c]", 4)) | ||||||
|  |         self.assertEqual(codecs.escape_decode(br"[\r]"), (b"[\x0d]", 4)) | ||||||
|  |         self.assertEqual(codecs.escape_decode(br"[\7]"), (b"[\x07]", 4)) | ||||||
|  |         self.assertEqual(codecs.escape_decode(br"[\8]"), (br"[\8]", 4)) | ||||||
|  |         self.assertEqual(codecs.escape_decode(br"[\78]"), (b"[\x078]", 5)) | ||||||
|  |         self.assertEqual(codecs.escape_decode(br"[\41]"), (b"[!]", 5)) | ||||||
|  |         self.assertEqual(codecs.escape_decode(br"[\418]"), (b"[!8]", 6)) | ||||||
|  |         self.assertEqual(codecs.escape_decode(br"[\101]"), (b"[A]", 6)) | ||||||
|  |         self.assertEqual(codecs.escape_decode(br"[\1010]"), (b"[A0]", 7)) | ||||||
|  |         self.assertEqual(codecs.escape_decode(br"[\501]"), (b"[A]", 6)) | ||||||
|  |         self.assertEqual(codecs.escape_decode(br"[\x41]"), (b"[A]", 6)) | ||||||
|  |         self.assertEqual(codecs.escape_decode(br"[\X41]"), (br"[\X41]", 6)) | ||||||
|  |         self.assertEqual(codecs.escape_decode(br"[\x410]"), (b"[A0]", 7)) | ||||||
|  |         for b in range(256): | ||||||
|  |             if b not in b'\n"\'\\abtnvfr01234567x': | ||||||
|  |                 self.assertEqual(codecs.escape_decode(b'\\' + bytes([b])), | ||||||
|  |                                  (b'\\' + bytes([b]), 2)) | ||||||
|  | 
 | ||||||
|  |     def test_errors(self): | ||||||
|  |         self.assertRaises(ValueError, codecs.escape_decode, br"\x") | ||||||
|  |         self.assertRaises(ValueError, codecs.escape_decode, br"[\x]") | ||||||
|  |         self.assertEqual(codecs.escape_decode(br"[\x]\x", "ignore"), (b"[]", 6)) | ||||||
|  |         self.assertEqual(codecs.escape_decode(br"[\x]\x", "replace"), (b"[?]?", 6)) | ||||||
|  |         self.assertRaises(ValueError, codecs.escape_decode, br"\x0") | ||||||
|  |         self.assertRaises(ValueError, codecs.escape_decode, br"[\x0]") | ||||||
|  |         self.assertEqual(codecs.escape_decode(br"[\x0]\x0", "ignore"), (b"[]", 8)) | ||||||
|  |         self.assertEqual(codecs.escape_decode(br"[\x0]\x0", "replace"), (b"[?]?", 8)) | ||||||
|  | 
 | ||||||
| class RecodingTest(unittest.TestCase): | class RecodingTest(unittest.TestCase): | ||||||
|     def test_recoding(self): |     def test_recoding(self): | ||||||
|         f = io.BytesIO() |         f = io.BytesIO() | ||||||
|  |  | ||||||
|  | @ -10,6 +10,8 @@ What's New in Python 3.2.4 | ||||||
| Core and Builtins | Core and Builtins | ||||||
| ----------------- | ----------------- | ||||||
| 
 | 
 | ||||||
|  | - Issue #16975: Fix error handling bug in the escape-decode bytes decoder. | ||||||
|  | 
 | ||||||
| - Issue #14850: Now a charmap decoder treats U+FFFE as "undefined mapping" | - Issue #14850: Now a charmap decoder treats U+FFFE as "undefined mapping" | ||||||
|   in any mapping, not only in a string. |   in any mapping, not only in a string. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -484,6 +484,10 @@ PyObject *PyBytes_DecodeEscape(const char *s, | ||||||
|                              errors); |                              errors); | ||||||
|                 goto failed; |                 goto failed; | ||||||
|             } |             } | ||||||
|  |             /* skip \x */ | ||||||
|  |             if (s < end && Py_ISXDIGIT(s[0])) | ||||||
|  |                 s++; /* and a hexdigit */ | ||||||
|  |             break; | ||||||
|         default: |         default: | ||||||
|             *p++ = '\\'; |             *p++ = '\\'; | ||||||
|             s--; |             s--; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Serhiy Storchaka
						Serhiy Storchaka