[Python-3000] socket makefile bug

Guido van Rossum guido at python.org
Sat Aug 4 00:43:33 CEST 2007


On 8/3/07, Jeremy Hylton <jeremy at alum.mit.edu> wrote:
> On 8/3/07, Guido van Rossum <guido at python.org> wrote:
> > The docs are out of date, we don't dup() any more (that was needed
> > only because we were using fdopen()). But what *should* happen is that
> > when you close the file object the socket is still open. The socket
> > wrapper's close() method should be fixed. I can look into that later
> > today.
>
> Ok.  I confirmed that calling dup() fixes the problem, but that
> doesn't work on Windows.  I also uncovered a bug in socket.py, which
> fails to set _can_dup_socket to True on platforms where you can dup a
> socket.

Followup: Jeremy fixed this by adding an explicit reference count to
the socket object, counting how many makefile() streams are hanging
off it. A few more unit tests (including httplib) are now working.

However, things are still not all good. E.g.

$ rm -f CP936.TXT
$ ./python  Lib/test/regrtest.py -uall test_codecmaps_cn
test_codecmaps_cn
	fetching http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP936.TXT
...
test test_codecmaps_cn crashed -- <class 'error'>: (9, 'Bad file descriptor')
1 test failed:
    test_codecmaps_cn
[68157 refs]
$ ./python
...
>>> import urllib
[46065 refs]
>>> x = urllib.urlopen("http://python.org").read()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/google/home/guido/python/py3k-struni/Lib/io.py",
line 390, in read
    return self.readall()
  File "/usr/local/google/home/guido/python/py3k-struni/Lib/io.py",
line 400, in readall
    data = self.read(DEFAULT_BUFFER_SIZE)
  File "/usr/local/google/home/guido/python/py3k-struni/Lib/io.py",
line 392, in read
    n = self.readinto(b)
  File "/usr/local/google/home/guido/python/py3k-struni/Lib/socket.py",
line 264, in readinto
    return self._sock.recv_into(b)
socket.error: (9, 'Bad file descriptor')
[60365 refs]
>>>

-- 
--Guido van Rossum (home page: http://www.python.org/~guido/)


More information about the Python-3000 mailing list