Skip to content

Commit de9f096

Browse files
committed
streams: Test invalid 'write' call; fix possible refleak
1 parent 15c8d73 commit de9f096

File tree

2 files changed

+7
-1
lines changed

2 files changed

+7
-1
lines changed

tests/test_tcp.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,10 @@ async def client(addr):
142142
writer.write(b'AAAA')
143143
self.assertEqual(await reader.readexactly(2), b'OK')
144144

145+
re = r'(a bytes-like object is required)|(must be byte-ish)'
146+
with self.assertRaisesRegex(TypeError, re):
147+
writer.write('AAAA')
148+
145149
writer.write(b'BBBB')
146150
self.assertEqual(await reader.readexactly(4), b'SPAM')
147151

uvloop/handles/stream.pyx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ cdef class _StreamWriteContext:
3333
ctx = _StreamWriteContext.__new__(_StreamWriteContext)
3434

3535
ctx.req.data = <void*> ctx
36-
Py_INCREF(ctx)
3736

3837
PyObject_GetBuffer(data, &ctx.py_buf, PyBUF_SIMPLE)
3938
ctx.uv_buf = uv.uv_buf_init(<char*>ctx.py_buf.buf, ctx.py_buf.len)
@@ -45,6 +44,9 @@ cdef class _StreamWriteContext:
4544
stream._loop._debug_stream_write_ctx_total += 1
4645
stream._loop._debug_stream_write_ctx_cnt += 1
4746

47+
# Do incref after everything else is done
48+
# (PyObject_GetBuffer for instance may fail with exception)
49+
Py_INCREF(ctx)
4850
return ctx
4951

5052
IF DEBUG:

0 commit comments

Comments
 (0)