[pypy-commit] pypy py3.6: CPython Issue 18550: Check error values in socket.setblocking()

amauryfa pypy.commits at gmail.com
Sat Dec 29 21:42:21 EST 2018


Author: Amaury Forgeot d'Arc <amauryfa at 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:


More information about the pypy-commit mailing list