[pypy-commit] pypy default: Add checks on the length argument given to socket.getsockopt(), like CPython

arigo pypy.commits at gmail.com
Mon May 29 04:27:59 EDT 2017


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r91435:b88087dc021a
Date: 2017-05-29 10:27 +0200
http://bitbucket.org/pypy/pypy/changeset/b88087dc021a/

Log:	Add checks on the length argument given to socket.getsockopt(), like
	CPython

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
@@ -310,6 +310,8 @@
                 return space.newint(self.sock.getsockopt_int(level, optname))
             except SocketError as e:
                 raise converted_error(space, e)
+        if buflen < 0 or buflen > 1024:
+            raise explicit_socket_error(space, "getsockopt buflen out of range")
         return space.newbytes(self.sock.getsockopt(level, optname, buflen))
 
     def gettimeout_w(self, space):
@@ -696,6 +698,12 @@
         w_exception = space.call_function(w_exception_class, space.newtext(message))
     return OperationError(w_exception_class, w_exception)
 
+def explicit_socket_error(space, msg):
+    w_exception_class = space.fromcache(SocketAPI).w_error
+    w_exception = space.call_function(w_exception_class, space.newtext(msg))
+    return OperationError(w_exception_class, w_exception)
+
+
 # ____________________________________________________________
 
 socketmethodnames = """
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
@@ -595,6 +595,16 @@
         s.setsockopt(_socket.IPPROTO_TCP, _socket.TCP_NODELAY, 1)
         assert s.getsockopt(_socket.IPPROTO_TCP, _socket.TCP_NODELAY, 0) == 1
 
+    def test_getsockopt_bad_length(self):
+        import _socket
+        s = _socket.socket()
+        buf = s.getsockopt(_socket.IPPROTO_TCP, _socket.TCP_NODELAY, 1024)
+        assert buf == b'\x00' * 4
+        raises(_socket.error, s.getsockopt,
+               _socket.IPPROTO_TCP, _socket.TCP_NODELAY, 1025)
+        raises(_socket.error, s.getsockopt,
+               _socket.IPPROTO_TCP, _socket.TCP_NODELAY, -1)
+
     def test_socket_ioctl(self):
         import _socket, sys
         if sys.platform != 'win32':


More information about the pypy-commit mailing list