diff options
author | Barry Warsaw <barry@python.org> | 2000-07-09 04:56:25 +0000 |
---|---|---|
committer | Barry Warsaw <barry@python.org> | 2000-07-09 04:56:25 +0000 |
commit | 302826231b00535693575b108f21e75798ec9dd6 (patch) | |
tree | b3cbb276fae6fa6544ce39408113ac90a4657c88 /Python | |
parent | 8e8230534211c74316bd575b9535ae9792d798bc (diff) | |
download | cpython-302826231b00535693575b108f21e75798ec9dd6.tar.gz |
EnvironmentError__init__(): The two case clauses were missing
`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)
Diffstat (limited to 'Python')
-rw-r--r-- | Python/exceptions.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/Python/exceptions.c b/Python/exceptions.c index 2726519c02..c32e15ccbc 100644 --- a/Python/exceptions.c +++ b/Python/exceptions.c @@ -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); |