Author: Armin Rigo <ar...@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': _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit