]> granicus.if.org Git - python/commitdiff
bpo-35504: Fix a SystemError when delete the characters_written attribute of an OSErr...
authorSerhiy Storchaka <storchaka@gmail.com>
Mon, 17 Dec 2018 14:43:14 +0000 (16:43 +0200)
committerGitHub <noreply@github.com>
Mon, 17 Dec 2018 14:43:14 +0000 (16:43 +0200)
Lib/test/test_exception_hierarchy.py
Misc/NEWS.d/next/Core and Builtins/2018-12-15-00-47-41.bpo-35504.9gVuen.rst [new file with mode: 0644]
Objects/exceptions.c

index 8649596790945bc91f3a4c90ce2734b82e8f200c..43b4af84039c0cb08e938091383fe2cbe03d7406 100644 (file)
@@ -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 (file)
index 0000000..622b50c
--- /dev/null
@@ -0,0 +1 @@
+Fixed a SystemError when delete the characters_written attribute of an OSError.
index 05578d4a6aad1bd83edbb876552aa2c97bf70da3..002a602373d7323a26d56ac968d6306095aef2e2 100644 (file)
@@ -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())