[Python-checkins] [3.11] bpo-31718: Fix io.IncrementalNewlineDecoder SystemErrors and segfaults (GH-18640) (#99841)

kumaraditya303 webhook-mailer at python.org
Mon Nov 28 06:17:40 EST 2022


https://github.com/python/cpython/commit/6f658dd60dc759b5cb146f321bff06a8417abaf4
commit: 6f658dd60dc759b5cb146f321bff06a8417abaf4
branch: 3.11
author: Kumar Aditya <59607654+kumaraditya303 at users.noreply.github.com>
committer: kumaraditya303 <59607654+kumaraditya303 at users.noreply.github.com>
date: 2022年11月28日T16:47:33+05:30
summary:
[3.11] bpo-31718: Fix io.IncrementalNewlineDecoder SystemErrors and segfaults (GH-18640) (#99841)
Co-authored-by: Oren Milman <orenmn at gmail.com>
Co-authored-by: Zackery Spytz <zspytz at gmail.com>
Co-authored-by: Kumar Aditya <59607654+kumaraditya303 at users.noreply.github.com>
(cherry picked from commit 53eef27133c1da395b3b4d7ce0ab1d5b743ffb41)
files:
A Misc/NEWS.d/next/Core and Builtins/2020-02-23-23-48-15.bpo-31718.sXko5e.rst
M Lib/test/test_io.py
M Modules/_io/textio.c
diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py
index e445f47d2145..79aa2da58622 100644
--- a/Lib/test/test_io.py
+++ b/Lib/test/test_io.py
@@ -3931,7 +3931,15 @@ def test_translate(self):
 self.assertEqual(decoder.decode(b"\r\r\n"), "\r\r\n")
 
 class CIncrementalNewlineDecoderTest(IncrementalNewlineDecoderTest):
- pass
+ @support.cpython_only
+ def test_uninitialized(self):
+ uninitialized = self.IncrementalNewlineDecoder.__new__(
+ self.IncrementalNewlineDecoder)
+ self.assertRaises(ValueError, uninitialized.decode, b'bar')
+ self.assertRaises(ValueError, uninitialized.getstate)
+ self.assertRaises(ValueError, uninitialized.setstate, (b'foo', 0))
+ self.assertRaises(ValueError, uninitialized.reset)
+
 
 class PyIncrementalNewlineDecoderTest(IncrementalNewlineDecoderTest):
 pass
diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-02-23-23-48-15.bpo-31718.sXko5e.rst b/Misc/NEWS.d/next/Core and Builtins/2020-02-23-23-48-15.bpo-31718.sXko5e.rst
new file mode 100644
index 000000000000..dd96c9e20d87
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2020-02-23-23-48-15.bpo-31718.sXko5e.rst	
@@ -0,0 +1,3 @@
+Raise :exc:`ValueError` instead of :exc:`SystemError` when methods of
+uninitialized :class:`io.IncrementalNewlineDecoder` objects are called.
+Patch by Oren Milman.
diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c
index 3369694653fd..6cb5a6861a15 100644
--- a/Modules/_io/textio.c
+++ b/Modules/_io/textio.c
@@ -231,17 +231,16 @@ _io_IncrementalNewlineDecoder___init___impl(nldecoder_object *self,
 PyObject *errors)
 /*[clinic end generated code: output=fbd04d443e764ec2 input=89db6b19c6b126bf]*/
 {
- self->decoder = decoder;
- Py_INCREF(decoder);
 
 if (errors == NULL) {
- self->errors = &_Py_ID(strict);
+ errors = Py_NewRef(&_Py_ID(strict));
 }
 else {
- self->errors = errors;
+ errors = Py_NewRef(errors);
 }
- Py_INCREF(self->errors);
 
+ Py_XSETREF(self->errors, errors);
+ Py_XSETREF(self->decoder, Py_NewRef(decoder));
 self->translate = translate ? 1 : 0;
 self->seennl = 0;
 self->pendingcr = 0;
@@ -276,6 +275,13 @@ check_decoded(PyObject *decoded)
 return 0;
 }
 
+#define CHECK_INITIALIZED_DECODER(self) \
+ if (self->errors == NULL) { \
+ PyErr_SetString(PyExc_ValueError, \
+ "IncrementalNewlineDecoder.__init__() not called"); \
+ return NULL; \
+ }
+
 #define SEEN_CR 1
 #define SEEN_LF 2
 #define SEEN_CRLF 4
@@ -289,11 +295,7 @@ _PyIncrementalNewlineDecoder_decode(PyObject *myself,
 Py_ssize_t output_len;
 nldecoder_object *self = (nldecoder_object *) myself;
 
- if (self->decoder == NULL) {
- PyErr_SetString(PyExc_ValueError,
- "IncrementalNewlineDecoder.__init__ not called");
- return NULL;
- }
+ CHECK_INITIALIZED_DECODER(self);
 
 /* decode input (with the eventual \r from a previous pass) */
 if (self->decoder != Py_None) {
@@ -507,6 +509,8 @@ _io_IncrementalNewlineDecoder_getstate_impl(nldecoder_object *self)
 PyObject *buffer;
 unsigned long long flag;
 
+ CHECK_INITIALIZED_DECODER(self);
+
 if (self->decoder != Py_None) {
 PyObject *state = PyObject_CallMethodNoArgs(self->decoder,
 &_Py_ID(getstate));
@@ -551,6 +555,8 @@ _io_IncrementalNewlineDecoder_setstate(nldecoder_object *self,
 PyObject *buffer;
 unsigned long long flag;
 
+ CHECK_INITIALIZED_DECODER(self);
+
 if (!PyTuple_Check(state)) {
 PyErr_SetString(PyExc_TypeError, "state argument must be a tuple");
 return NULL;
@@ -581,6 +587,8 @@ static PyObject *
 _io_IncrementalNewlineDecoder_reset_impl(nldecoder_object *self)
 /*[clinic end generated code: output=32fa40c7462aa8ff input=728678ddaea776df]*/
 {
+ CHECK_INITIALIZED_DECODER(self);
+
 self->seennl = 0;
 self->pendingcr = 0;
 if (self->decoder != Py_None)
@@ -592,6 +600,8 @@ _io_IncrementalNewlineDecoder_reset_impl(nldecoder_object *self)
 static PyObject *
 incrementalnewlinedecoder_newlines_get(nldecoder_object *self, void *context)
 {
+ CHECK_INITIALIZED_DECODER(self);
+
 switch (self->seennl) {
 case SEEN_CR:
 return PyUnicode_FromString("\r");


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /