diff -r 6a6b1ee306e3 Modules/selectmodule.c --- a/Modules/selectmodule.c Mon Nov 11 22:11:55 2013 +1000 +++ b/Modules/selectmodule.c Tue Nov 12 15:48:05 2013 +0100 @@ -356,7 +356,8 @@ update_ufd_array(pollObject *self) assert(i < self->ufd_len); /* Never overflow */ self->ufds[i].fd = (int)PyLong_AsLong(key); - self->ufds[i].events = (short)PyLong_AsLong(value); + /* Why does a bitfield need to be signed at all? */ + self->ufds[i].events = (short)PyLong_AsUnsignedLong(value); i++; } assert(i == self->ufd_len); @@ -376,10 +377,10 @@ poll_register(pollObject *self, PyObject { PyObject *o, *key, *value; int fd; - short events = POLLIN | POLLPRI | POLLOUT; + unsigned short events = POLLIN | POLLPRI | POLLOUT; int err; - if (!PyArg_ParseTuple(args, "O|h:register", &o, &events)) { + if (!PyArg_ParseTuple(args, "O|H:register", &o, &events)) { return NULL; } @@ -391,7 +392,7 @@ poll_register(pollObject *self, PyObject key = PyLong_FromLong(fd); if (key == NULL) return NULL; - value = PyLong_FromLong(events); + value = PyLong_FromUnsignedLong(events); if (value == NULL) { Py_DECREF(key); return NULL; @@ -419,10 +420,11 @@ static PyObject * poll_modify(pollObject *self, PyObject *args) { PyObject *o, *key, *value; - int fd, events; + int fd; + unsigned short events; int err; - if (!PyArg_ParseTuple(args, "Oi:modify", &o, &events)) { + if (!PyArg_ParseTuple(args, "OH:modify", &o, &events)) { return NULL; } @@ -439,7 +441,7 @@ poll_modify(pollObject *self, PyObject * Py_DECREF(key); return NULL; } - value = PyLong_FromLong(events); + value = PyLong_FromUnsignedLong(events); if (value == NULL) { Py_DECREF(key); return NULL; @@ -574,11 +576,12 @@ poll_poll(pollObject *self, PyObject *ar } PyTuple_SET_ITEM(value, 0, num); - /* The &0xffff is a workaround for AIX. 'revents' - is a 16-bit short, and IBM assigned POLLNVAL + /* The 'unsigned' cast is necessary for AIX. 'revents' + is a 16-bit signed short, but IBM assigned POLLNVAL to be 0x8000, so the conversion to int results - in a negative number. See SF bug #923315. */ - num = PyLong_FromLong(self->ufds[i].revents & 0xffff); + in a negative number. See issue17919 and issue923315. + Why does a bitfield need to be signed at all? */ + num = PyLong_FromUnsignedLong((unsigned short)self->ufds[i].revents); if (num == NULL) { Py_DECREF(value); goto error; @@ -729,12 +732,13 @@ static PyObject * internal_devpoll_register(devpollObject *self, PyObject *args, int remove) { PyObject *o; - int fd, events = POLLIN | POLLPRI | POLLOUT; + int fd; + unsigned short events = POLLIN | POLLPRI | POLLOUT; if (self->fd_devpoll < 0) return devpoll_err_closed(); - if (!PyArg_ParseTuple(args, "O|i:register", &o, &events)) { + if (!PyArg_ParseTuple(args, "O|H:register", &o, &events)) { return NULL; } @@ -752,7 +756,8 @@ internal_devpoll_register(devpollObject } self->fds[self->n_fds].fd = fd; - self->fds[self->n_fds].events = events; + /* Why does a bitfield need to be signed? */ + self->fds[self->n_fds].events = (short)events; if (++self->n_fds == self->max_n_fds) { if (devpoll_flush(self)) @@ -886,7 +891,13 @@ devpoll_poll(devpollObject *self, PyObje else { for (i = 0; i < poll_result; i++) { num1 = PyLong_FromLong(self->fds[i].fd); - num2 = PyLong_FromLong(self->fds[i].revents); + /* The 'unsigned' cast may become necessary for AIX when it + starts to provide /dev/poll (maybe never). 'revents' + is a 16-bit signed short, but IBM assigned POLLNVAL + to be 0x8000, so the conversion to int results + in a negative number. See issue17919 and issue923315. + Why does a bitfield need to be signed at all? */ + num2 = PyLong_FromUnsignedLong((unsigned short)self->fds[i].revents); if ((num1 == NULL) || (num2 == NULL)) { Py_XDECREF(num1); Py_XDECREF(num2);