From 7dfeb42939b36919d59943360e737389e1202c47 Mon Sep 17 00:00:00 2001 From: Barry Warsaw Date: Sun, 9 Jul 2000 04:56:25 +0000 Subject: 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) --- Python/exceptions.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Python/exceptions.c b/Python/exceptions.c index 2726519..c32e15c 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); -- cgit v0.12