From e2af34fcf84b41189b54e1f2912faded5daabaca Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 17 Dec 2018 16:43:14 +0200 Subject: [PATCH] bpo-35504: Fix a SystemError when delete the characters_written attribute of an OSError. (GH-11172) --- Lib/test/test_exception_hierarchy.py | 5 +++++ .../2018-12-15-00-47-41.bpo-35504.9gVuen.rst | 1 + Objects/exceptions.c | 8 ++++++++ 3 files changed, 14 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-12-15-00-47-41.bpo-35504.9gVuen.rst diff --git a/Lib/test/test_exception_hierarchy.py b/Lib/test/test_exception_hierarchy.py index 8649596790..43b4af8403 100644 --- a/Lib/test/test_exception_hierarchy.py +++ b/Lib/test/test_exception_hierarchy.py @@ -150,10 +150,15 @@ class AttributesTest(unittest.TestCase): e = BlockingIOError(*args[:n]) with self.assertRaises(AttributeError): e.characters_written + with self.assertRaises(AttributeError): + del e.characters_written e = BlockingIOError("a", "b", 3) self.assertEqual(e.characters_written, 3) e.characters_written = 5 self.assertEqual(e.characters_written, 5) + del e.characters_written + with self.assertRaises(AttributeError): + e.characters_written class ExplicitSubclassingTest(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-12-15-00-47-41.bpo-35504.9gVuen.rst b/Misc/NEWS.d/next/Core and Builtins/2018-12-15-00-47-41.bpo-35504.9gVuen.rst new file mode 100644 index 0000000000..622b50ca62 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2018-12-15-00-47-41.bpo-35504.9gVuen.rst @@ -0,0 +1 @@ +Fixed a SystemError when delete the characters_written attribute of an OSError. diff --git a/Objects/exceptions.c b/Objects/exceptions.c index 05578d4a6a..002a602373 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -1196,6 +1196,14 @@ OSError_written_get(PyOSErrorObject *self, void *context) static int OSError_written_set(PyOSErrorObject *self, PyObject *arg, void *context) { + if (arg == NULL) { + if (self->written == -1) { + PyErr_SetString(PyExc_AttributeError, "characters_written"); + return -1; + } + self->written = -1; + return 0; + } Py_ssize_t n; n = PyNumber_AsSsize_t(arg, PyExc_ValueError); if (n == -1 && PyErr_Occurred()) -- 2.40.0