[pypy-commit] pypy default: issue #1842 fixed: don't crash on select.select([large_number], ...)
arigo
noreply at buildbot.pypy.org
Sat Aug 30 18:24:27 CEST 2014
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r73211:f41115b2bb5a
Date: 2014-08-30 18:23 +0200
http://bitbucket.org/pypy/pypy/changeset/f41115b2bb5a/
Log: issue #1842 fixed: don't crash on select.select([large_number], ...)
diff --git a/pypy/module/select/interp_select.py b/pypy/module/select/interp_select.py
--- a/pypy/module/select/interp_select.py
+++ b/pypy/module/select/interp_select.py
@@ -98,6 +98,9 @@
for w_f in list_w:
fd = space.c_filedescriptor_w(w_f)
if fd > nfds:
+ if _c.MAX_FD_SIZE is not None and fd >= _c.MAX_FD_SIZE:
+ raise oefmt(space.w_ValueError,
+ "file descriptor out of range in select()")
nfds = fd
_c.FD_SET(fd, ll_list)
fdlist.append(fd)
diff --git a/pypy/module/select/test/test_select.py b/pypy/module/select/test/test_select.py
--- a/pypy/module/select/test/test_select.py
+++ b/pypy/module/select/test/test_select.py
@@ -198,6 +198,16 @@
finally:
writeend.close()
+ def test_select_descr_out_of_bounds(self):
+ import sys, select
+ raises(ValueError, select.select, [-1], [], [])
+ raises(ValueError, select.select, [], [-2], [])
+ raises(ValueError, select.select, [], [], [-3])
+ if sys.platform != 'win32':
+ raises(ValueError, select.select, [2000000000], [], [])
+ raises(ValueError, select.select, [], [2000000000], [])
+ raises(ValueError, select.select, [], [], [2000000000])
+
def test_poll(self):
import select
if not hasattr(select, 'poll'):
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
@@ -651,9 +651,16 @@
return rwin32.FormatError(errno)
def gai_strerror_str(errno):
return rwin32.FormatError(errno)
+
+ # WinSock does not use a bitmask in select, and uses
+ # socket handles greater than FD_SETSIZE
+ MAX_FD_SIZE = None
+
else:
from rpython.rlib.rposix import get_errno as geterrno
socket_strerror_str = os.strerror
def gai_strerror_str(errno):
return rffi.charp2str(gai_strerror(errno))
+
+ MAX_FD_SIZE = FD_SETSIZE
diff --git a/rpython/rlib/ropenssl.py b/rpython/rlib/ropenssl.py
--- a/rpython/rlib/ropenssl.py
+++ b/rpython/rlib/ropenssl.py
@@ -5,6 +5,7 @@
from rpython.translator.platform import platform
from rpython.translator.tool.cbuild import ExternalCompilationInfo
from rpython.rlib.unroll import unrolling_iterable
+from rpython.rlib._rsocket_rffi import MAX_FD_SIZE
if sys.platform == 'win32' and platform.name != 'mingw32':
@@ -47,13 +48,6 @@
include_dir='inc32', library_dir='out32'),
])
-# WinSock does not use a bitmask in select, and uses
-# socket handles greater than FD_SETSIZE
-if sys.platform == 'win32':
- MAX_FD_SIZE = None
-else:
- from rpython.rlib._rsocket_rffi import FD_SETSIZE as MAX_FD_SIZE
-
ASN1_STRING = lltype.Ptr(lltype.ForwardReference())
ASN1_ITEM = rffi.COpaquePtr('ASN1_ITEM')
X509_NAME = rffi.COpaquePtr('X509_NAME')
More information about the pypy-commit
mailing list