]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
EnvironmentError__init__(): The two case clauses were missing
authorBarry Warsaw <barry@python.org>
Sun, 9 Jul 2000 04:56:25 +0000 (04:56 +0000)
committerBarry Warsaw <barry@python.org>
Sun, 9 Jul 2000 04:56:25 +0000 (04:56 +0000)
`break's.  This first missing break caused a memory leak when case 3
fell through case 2 in the following example:

import os
os.chmod('/missing', 0600)

Python/exceptions.c

index 2726519c025e55ae0b68f67bffb54f0df6b23dfc..c32e15ccbc5d6a661d8193f85e0946bf15e4bf2c 100644 (file)
@@ -440,8 +440,10 @@ EnvironmentError__init__(PyObject* self, PyObject* args)
 
     switch (PySequence_Length(args)) {
     case 3:
-       /* open() errors give third argument which is the filename.  But so
-        * common in-place unpacking doesn't break, e.g.:
+       /* Where a function has a single filename, such as open() or some
+        * of the os module functions, PyErr_SetFromErrnoWithFilename() is
+        * called, giving a third argument which is the filename.  But, so
+        * that old code using in-place unpacking doesn't break, e.g.:
         * 
         * except IOError, (errno, strerror):
         * 
@@ -465,9 +467,12 @@ EnvironmentError__init__(PyObject* self, PyObject* args)
        subslice = PySequence_GetSlice(args, 0, 2);
        if (!subslice || PyObject_SetAttrString(self, "args", subslice))
            goto finally;
+       break;
 
     case 2:
-       /* common case: PyErr_SetFromErrno() */
+       /* Used when PyErr_SetFromErrno() is called and no filename
+        * argument is given.
+        */
        item0 = PySequence_GetItem(args, 0);
        item1 = PySequence_GetItem(args, 1);
        if (!item0 || !item1)
@@ -478,6 +483,7 @@ EnvironmentError__init__(PyObject* self, PyObject* args)
        {
            goto finally;
        }
+       break;
     }
 
     Py_INCREF(Py_None);