Make send() and recv() fail when channel is closed

``sendall()`` was checking if the channel has been closed,
and failed accordingly, but ``send()`` and ``recv()`` did not.
This meant that ``chan.send("foo")`` when the channel was already
closed, just blocked forever.
This commit is contained in:
Tomer Filiba 2012-10-26 15:44:34 +03:00 committed by Jeff Forcier
parent 2832f3c60f
commit bc3674d0f0
1 changed files with 16 additions and 3 deletions

View File

@ -605,6 +605,10 @@ class Channel (object):
@raise socket.timeout: if no data is ready before the timeout set by
L{settimeout}.
"""
if self.closed:
# this doesn't seem useful, but it is the documented behavior of Socket
raise socket.error(errno.EBADF, 'Socket is closed')
try:
out = self.in_buffer.read(nbytes, self.timeout)
except PipeTimeout, e:
@ -655,6 +659,10 @@ class Channel (object):
@since: 1.1
"""
if self.closed:
# this doesn't seem useful, but it is the documented behavior of Socket
raise socket.error(errno.EBADF, 'Socket is closed')
try:
out = self.in_stderr_buffer.read(nbytes, self.timeout)
except PipeTimeout, e:
@ -708,6 +716,10 @@ class Channel (object):
@raise socket.timeout: if no data could be sent before the timeout set
by L{settimeout}.
"""
if self.closed:
# this doesn't seem useful, but it is the documented behavior of Socket
raise socket.error(errno.EBADF, 'Socket is closed')
size = len(s)
self.lock.acquire()
try:
@ -745,6 +757,10 @@ class Channel (object):
@since: 1.1
"""
if self.closed:
# this doesn't seem useful, but it is the documented behavior of Socket
raise socket.error(errno.EBADF, 'Socket is closed')
size = len(s)
self.lock.acquire()
try:
@ -783,9 +799,6 @@ class Channel (object):
This is irritating, but identically follows python's API.
"""
while s:
if self.closed:
# this doesn't seem useful, but it is the documented behavior of Socket
raise socket.error('Socket is closed')
sent = self.send(s)
s = s[sent:]
return None