Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e5e5059

Browse files
committed
When the socket is closed, don't just assign 0 to self._sock.
This breaks software that excepts a socket.error but not an AttributeError.
1 parent 241d69c commit e5e5059

1 file changed

Lines changed: 18 additions & 8 deletions

File tree

Lib/socket.py

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -122,13 +122,18 @@ def getfqdn(name=''):
122122
# These are not actually used on other platforms.
123123
#
124124

125+
_socketmethods = (
126+
'bind', 'connect', 'connect_ex', 'fileno', 'listen',
127+
'getpeername', 'getsockname', 'getsockopt', 'setsockopt',
128+
'recv', 'recvfrom', 'send', 'sendto', 'setblocking', 'shutdown')
129+
125130
class _socketobject:
126131

127132
def __init__(self, sock):
128133
self._sock = sock
129134

130135
def close(self):
131-
self._sock = 0
136+
self._sock = _closedsocket()
132137

133138
def __del__(self):
134139
self.close()
@@ -143,16 +148,21 @@ def dup(self):
143148
def makefile(self, mode='r', bufsize=-1):
144149
return _fileobject(self._sock, mode, bufsize)
145150

146-
_s = "def %s(self, *args): return apply(self._sock.%s, args)\n\n"
147-
for _m in ('bind', 'connect', 'connect_ex', 'fileno', 'listen',
148-
'getpeername', 'getsockname',
149-
'getsockopt', 'setsockopt',
150-
'recv', 'recvfrom', 'send', 'sendto',
151-
'setblocking',
152-
'shutdown'):
151+
_s = "def %s(self, *args): return self._sock.%s(*args)\n\n"
152+
for _m in _socketmethods:
153153
exec _s % (_m, _m)
154154

155155

156+
class _closedsocket:
157+
158+
def _bummer(self):
159+
raise error(9, 'Bad file descriptor')
160+
161+
_s = "def %s(self, *args): self._bummer()\n\n"
162+
for _m in _socketmethods:
163+
exec _s % _m
164+
165+
156166
class _fileobject:
157167

158168
def __init__(self, sock, mode, bufsize):

0 commit comments

Comments
 (0)