Author: Amaury Forgeot d'Arc <amaur...@gmail.com> Branch: py3.6 Changeset: r95536:cafe126a986a Date: 2018-08-06 15:49 +0200 http://bitbucket.org/pypy/pypy/changeset/cafe126a986a/
Log: CPython Issue 18550: Check error values in socket.setblocking() diff --git a/pypy/module/_socket/interp_socket.py b/pypy/module/_socket/interp_socket.py --- a/pypy/module/_socket/interp_socket.py +++ b/pypy/module/_socket/interp_socket.py @@ -608,14 +608,17 @@ return space.newint(count) @unwrap_spec(flag=int) - def setblocking_w(self, flag): + def setblocking_w(self, space, flag): """setblocking(flag) Set the socket to blocking (flag is true) or non-blocking (false). setblocking(True) is equivalent to settimeout(None); setblocking(False) is equivalent to settimeout(0.0). """ - self.sock.setblocking(bool(flag)) + try: + self.sock.setblocking(bool(flag)) + except SocketError as e: + raise converted_error(space, e) @unwrap_spec(level=int, optname=int) def setsockopt_w(self, space, level, optname, w_optval): @@ -654,7 +657,10 @@ timeout = space.float_w(w_timeout) if timeout < 0.0: raise oefmt(space.w_ValueError, "Timeout value out of range") - self.sock.settimeout(timeout) + try: + self.sock.settimeout(timeout) + except SocketError as e: + raise converted_error(space, e) @unwrap_spec(nbytes=int, flags=int) def recv_into_w(self, space, w_buffer, nbytes=0, flags=0): diff --git a/pypy/module/_socket/test/test_sock_app.py b/pypy/module/_socket/test/test_sock_app.py --- a/pypy/module/_socket/test/test_sock_app.py +++ b/pypy/module/_socket/test/test_sock_app.py @@ -402,6 +402,12 @@ e = raises(OSError, s.close) assert e.value.errno in (errno.EBADF, errno.ENOTSOCK) + def test_setblocking_invalidfd(self): + import errno, _socket + s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM, 0) + _socket.socket(fileno=s.fileno()).close() + raises(OSError, s.setblocking, False) + def test_socket_connect(self): import _socket, os s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM, 0) diff --git a/rpython/rlib/_rsocket_rffi.py b/rpython/rlib/_rsocket_rffi.py --- a/rpython/rlib/_rsocket_rffi.py +++ b/rpython/rlib/_rsocket_rffi.py @@ -1270,7 +1270,8 @@ getprotobyname = external('getprotobyname', [rffi.CCHARP], lltype.Ptr(cConfig.protoent)) if _POSIX: - fcntl = external('fcntl', [socketfd_type, rffi.INT, rffi.INT], rffi.INT) + fcntl = external('fcntl', [socketfd_type, rffi.INT, rffi.INT], rffi.INT, + save_err=SAVE_ERR) socketpair_t = rffi.CArray(socketfd_type) socketpair = external('socketpair', [rffi.INT, rffi.INT, rffi.INT, lltype.Ptr(socketpair_t)], rffi.INT, @@ -1282,7 +1283,7 @@ if _WIN32: ioctlsocket = external('ioctlsocket', [socketfd_type, rffi.LONG, rffi.ULONGP], - rffi.INT) + rffi.INT, save_err=SAVE_ERR) select = external('select', [rffi.INT, fd_set, fd_set, diff --git a/rpython/rlib/rsocket.py b/rpython/rlib/rsocket.py --- a/rpython/rlib/rsocket.py +++ b/rpython/rlib/rsocket.py @@ -567,17 +567,21 @@ if hasattr(_c, 'fcntl'): def _setblocking(self, block): orig_delay_flag = intmask(_c.fcntl(self.fd, _c.F_GETFL, 0)) + if orig_delay_flag == -1: + raise self.error_handler() if block: delay_flag = orig_delay_flag & ~_c.O_NONBLOCK else: delay_flag = orig_delay_flag | _c.O_NONBLOCK if orig_delay_flag != delay_flag: - _c.fcntl(self.fd, _c.F_SETFL, delay_flag) + if _c.fcntl(self.fd, _c.F_SETFL, delay_flag) == -1: + raise self.error_handler() elif hasattr(_c, 'ioctlsocket'): def _setblocking(self, block): flag = lltype.malloc(rffi.ULONGP.TO, 1, flavor='raw') flag[0] = rffi.cast(rffi.ULONG, not block) - _c.ioctlsocket(self.fd, _c.FIONBIO, flag) + if _c.ioctlsocket(self.fd, _c.FIONBIO, flag) != 0: + raise self.error_handler() lltype.free(flag, flavor='raw') if hasattr(_c, 'poll') and not _c.poll_may_be_broken: _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit