]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-35062: Fix parsing _io.IncrementalNewlineDecoder's *translate* argument. (GH...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Wed, 31 Oct 2018 12:36:34 +0000 (05:36 -0700)
committerGitHub <noreply@github.com>
Wed, 31 Oct 2018 12:36:34 +0000 (05:36 -0700)
_io.IncrementalNewlineDecoder's initializer possibly assigns out-of-range
value to the bitwise struct field.
(cherry picked from commit b08746bfdf64e55ce33516f2065fa2aa4f51be95)

Co-authored-by: Xiang Zhang <angwerzx@126.com>
Lib/test/test_io.py
Misc/NEWS.d/next/Library/2018-10-29-23-09-24.bpo-35062.dQS1ng.rst [new file with mode: 0644]
Modules/_io/textio.c

index f306917ca7da2f5e2bb38b867d81b33094a14c07..f29c16cb47c56fb98c460e235700133700c3c497 100644 (file)
@@ -3547,6 +3547,16 @@ class IncrementalNewlineDecoderTest(unittest.TestCase):
         dec = self.IncrementalNewlineDecoder(None, translate=True)
         _check(dec)
 
+    def test_translate(self):
+        # issue 35062
+        for translate in (-2, -1, 1, 2):
+            decoder = codecs.getincrementaldecoder("utf-8")()
+            decoder = self.IncrementalNewlineDecoder(decoder, translate)
+            self.check_newline_decoding_utf8(decoder)
+        decoder = codecs.getincrementaldecoder("utf-8")()
+        decoder = self.IncrementalNewlineDecoder(decoder, translate=0)
+        self.assertEqual(decoder.decode(b"\r\r\n"), "\r\r\n")
+
 class CIncrementalNewlineDecoderTest(IncrementalNewlineDecoderTest):
     pass
 
diff --git a/Misc/NEWS.d/next/Library/2018-10-29-23-09-24.bpo-35062.dQS1ng.rst b/Misc/NEWS.d/next/Library/2018-10-29-23-09-24.bpo-35062.dQS1ng.rst
new file mode 100644 (file)
index 0000000..b77ed86
--- /dev/null
@@ -0,0 +1,2 @@
+Fix incorrect parsing of :class:`_io.IncrementalNewlineDecoder`'s
+*translate* argument.
index d582d3fb13407090829ed3ffa2f3069cd6f9617a..ebc3c04d673aa011fdc8f98dc9e8147e7b0b1d1d 100644 (file)
@@ -268,7 +268,7 @@ _io_IncrementalNewlineDecoder___init___impl(nldecoder_object *self,
         self->errors = errors;
     }
 
-    self->translate = translate;
+    self->translate = translate ? 1 : 0;
     self->seennl = 0;
     self->pendingcr = 0;