Mercurial > cpython-lru_cache-weakref
diff Python/exceptions.c @ 13453:d6198e703602 legacy-trunk
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)
| author | Barry Warsaw <barry@python.org> |
|---|---|
| date | Sun, 09 Jul 2000 04:56:25 +0000 |
| parents | 3e07a7315af5 |
| children | 67fd19d74528 |
line wrap: on
line diff
--- a/Python/exceptions.c Sun Jul 09 04:36:04 2000 +0000 +++ b/Python/exceptions.c Sun Jul 09 04:56:25 2000 +0000 @@ -440,8 +440,10 @@ 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 @@ 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 @@ { goto finally; } + break; } Py_INCREF(Py_None);
