Skip to content

Commit 14d83c1

Browse files
committed
Fix loop.create_server() to error on non-int backlog argument
1 parent aa99a18 commit 14d83c1

File tree

4 files changed

+27
-4
lines changed

4 files changed

+27
-4
lines changed

tests/test_tcp.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,19 @@ async def start_server():
498498

499499
class Test_UV_TCP(_TestTCP, tb.UVTestCase):
500500

501+
def test_create_server_float_backlog(self):
502+
# asyncio spits out a warning we cannot suppress
503+
504+
async def runner(bl):
505+
await self.loop.create_server(
506+
asyncio.Protocol,
507+
None, 0, backlog=bl)
508+
509+
for bl in (1.1, '1'):
510+
with self.subTest(backlog=bl):
511+
with self.assertRaisesRegex(TypeError, 'integer'):
512+
self.loop.run_until_complete(runner(bl))
513+
501514
def test_many_small_writes(self):
502515
N = 10000
503516
TOTAL = 0

uvloop/handles/streamserver.pxd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ cdef class UVStreamServer(UVSocketHandle):
1212

1313
cdef inline _mark_as_open(self)
1414

15-
cdef inline listen(self, int backlog)
15+
cdef inline listen(self, backlog)
1616
cdef inline _on_listen(self)
1717

1818
cdef UVStream _make_new_transport(self, object protocol, object waiter)

uvloop/handles/streamserver.pyx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,15 @@ cdef class UVStreamServer(UVSocketHandle):
2020
self.protocol_factory = protocol_factory
2121
self._server = server
2222

23-
cdef inline listen(self, int backlog):
23+
cdef inline listen(self, backlog):
2424
cdef int err
2525
self._ensure_alive()
2626

27+
if not isinstance(backlog, int):
28+
# Don't allow floats
29+
raise TypeError('integer argument expected, got {}'.format(
30+
type(backlog).__name__))
31+
2732
if self.protocol_factory is None:
2833
raise RuntimeError('unable to listen(); no protocol_factory')
2934

uvloop/loop.pyx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1127,7 +1127,7 @@ cdef class Loop:
11271127
int family=uv.AF_UNSPEC,
11281128
int flags=uv.AI_PASSIVE,
11291129
sock=None,
1130-
int backlog=100,
1130+
backlog=100,
11311131
ssl=None,
11321132
reuse_address=None, # ignored, libuv sets it
11331133
reuse_port=None):
@@ -1227,9 +1227,13 @@ cdef class Loop:
12271227
except OSError as err:
12281228
pyaddr = __convert_sockaddr_to_pyaddr(
12291229
<system.sockaddr*>addrinfo.ai_addr)
1230+
tcp._close()
12301231
raise OSError(err.errno, 'error while attempting '
12311232
'to bind on address %r: %s'
12321233
% (pyaddr, err.strerror.lower()))
1234+
except:
1235+
tcp._close()
1236+
raise
12331237

12341238
server._add_server(tcp)
12351239

@@ -1249,11 +1253,12 @@ cdef class Loop:
12491253
tcp.open(fileno)
12501254
tcp._attach_fileobj(sock)
12511255
tcp.listen(backlog)
1252-
server._add_server(tcp)
12531256
except:
12541257
tcp._close()
12551258
raise
12561259

1260+
server._add_server(tcp)
1261+
12571262
return server
12581263

12591264
async def create_connection(self, protocol_factory, host=None, port=None, *,

0 commit comments

Comments
 (0)