Server: FreeBSD 6.0, Python 2.4.2, CP 2.1
Client: WinXP SP1, Firefox 1.07

I'm seeing a consistent hang in CherryPy when a client issues a TCP reset. The easiest way to repro it:

On the server:
1. tg-admin quickstart resettest
2. cd resettest && python resettest-start.py

On the client:
1. Go to http://servermachine:8080/
2. After it loads, pound on the "reload page" button quickly.

After about 5 or 6 refreshes, the server gets a traceback:

192.168.1.254 - - [2005/11/04 16:41:16] "GET / HTTP/1.1" 200 2101
Exception in thread Thread-3:
Traceback (most recent call last):
  File "/usr/local/lib/python2.4/threading.py", line 442, in __bootstrap
    self.run()
  File "/usr/local/lib/python2.4/site-packages/CherryPy-2.1.0-py2.4.egg/cherrypy/_cpwsgiserver.py", line 247, in run
    request.write(line)
  File "/usr/local/lib/python2.4/site-packages/CherryPy-2.1.0-py2.4.egg/cherrypy/_cpwsgiserver.py", line 192, in write
    self.wfile.flush()
  File "/usr/local/lib/python2.4/socket.py", line 243, in flush
    self._sock.sendall(buffer)
error: (54, 'Connection reset by peer')

At this point, the whole server process is hung (doesn't accept new connections), and won't die until I kill it.  I've checked with a packet sniffer, and I can see that when the server is delivering page information after the user has reloaded the page, the browser sends a TCP RST, and nothing in the server's call frame is handling it.  Makes for a fine denial of service attack...

It looks like a straightforward CherryPy bug, but before I file it there, can anyone try reproducing this in another environment? Note that it doesn't reproduce when the client and server are on the same machine--no chance for a TCP reset over loopback, I imagine.

Thanks much!
--
Tim Lesher <[EMAIL PROTECTED]>

Reply via email to