diff --git a/Lib/test/test_epoll.py b/Lib/test/test_epoll.py --- a/Lib/test/test_epoll.py +++ b/Lib/test/test_epoll.py @@ -71,16 +71,18 @@ class TestEPoll(unittest.TestCase): raise AssertionError(str(e)) self.assertTrue(ep.fileno() > 0, ep.fileno()) self.assertTrue(not ep.closed) ep.close() self.assertTrue(ep.closed) self.assertRaises(ValueError, ep.fileno) if hasattr(select, "EPOLL_CLOEXEC"): select.epoll(select.EPOLL_CLOEXEC).close() + select.epoll(flags=select.EPOLL_CLOEXEC).close() + select.epoll(flags=0).close() self.assertRaises(OSError, select.epoll, flags=12356) def test_badcreate(self): self.assertRaises(TypeError, select.epoll, 1, 2, 3) self.assertRaises(TypeError, select.epoll, 'foo') self.assertRaises(TypeError, select.epoll, None) self.assertRaises(TypeError, select.epoll, ()) self.assertRaises(TypeError, select.epoll, ['foo']) diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -1247,34 +1247,32 @@ pyepoll_internal_close(pyEpoll_Object *s if (close(epfd) < 0) save_errno = errno; Py_END_ALLOW_THREADS } return save_errno; } static PyObject * -newPyEpoll_Object(PyTypeObject *type, int sizehint, int flags, SOCKET fd) +newPyEpoll_Object(PyTypeObject *type, int sizehint, SOCKET fd) { pyEpoll_Object *self; assert(type != NULL && type->tp_alloc != NULL); self = (pyEpoll_Object *) type->tp_alloc(type, 0); if (self == NULL) return NULL; if (fd == -1) { Py_BEGIN_ALLOW_THREADS #ifdef HAVE_EPOLL_CREATE1 - flags |= EPOLL_CLOEXEC; - if (flags) - self->epfd = epoll_create1(flags); - else + self->epfd = epoll_create1(EPOLL_CLOEXEC); +#else + self->epfd = epoll_create(sizehint); #endif - self->epfd = epoll_create(sizehint); Py_END_ALLOW_THREADS } else { self->epfd = fd; } if (self->epfd < 0) { Py_DECREF(self); PyErr_SetFromErrno(PyExc_OSError); @@ -1300,18 +1298,22 @@ pyepoll_new(PyTypeObject *type, PyObject if (!PyArg_ParseTupleAndKeywords(args, kwds, "|ii:epoll", kwlist, &sizehint, &flags)) return NULL; if (sizehint < 0) { PyErr_SetString(PyExc_ValueError, "negative sizehint"); return NULL; } + if (flags && flags != EPOLL_CLOEXEC) { + PyErr_SetString(PyExc_OSError, "invalid flags"); + return NULL; + } - return newPyEpoll_Object(type, sizehint, flags, -1); + return newPyEpoll_Object(type, sizehint, -1); } static void pyepoll_dealloc(pyEpoll_Object *self) { (void)pyepoll_internal_close(self); Py_TYPE(self)->tp_free(self); @@ -1359,17 +1361,17 @@ Return the epoll control file descriptor static PyObject* pyepoll_fromfd(PyObject *cls, PyObject *args) { SOCKET fd; if (!PyArg_ParseTuple(args, "i:fromfd", &fd)) return NULL; - return newPyEpoll_Object((PyTypeObject*)cls, FD_SETSIZE - 1, 0, fd); + return newPyEpoll_Object((PyTypeObject*)cls, FD_SETSIZE - 1, fd); } PyDoc_STRVAR(pyepoll_fromfd_doc, "fromfd(fd) -> epoll\n\ \n\ Create an epoll object from a given control fd."); static PyObject *