[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