New submission from Martin Panter:

Bind method may easily fail on Unix if there is no permission to bind to a 
privileged port:

>>> try: TCPServer(("", 80), ...)
... except Exception as err: err
... 
PermissionError(13, 'Permission denied')
>>> gc.collect()
__main__:1: ResourceWarning: unclosed <socket.socket fd=3, 
family=AddressFamily.AF_INET, type=SocketType.SOCK_STREAM, proto=0, 
laddr=('0.0.0.0', 0)>
0

This problem is inherited by HTTPServer and WSGIServer. My current workaround 
includes this code in a BaseServer fixup mixin, invoking server_close() if 
__init__() fails:

class Server(BaseServer, Context):
    def __init__(self, ...):
        try:
            super().__init__((host, port), RequestHandlerClass)
        except:  # Workaround for socketserver.TCPServer leaking socket
            self.close()
            raise
    
    def close(self):
        return self.server_close()

----------
components: Library (Lib)
messages: 227017
nosy: vadmium
priority: normal
severity: normal
status: open
title: socketserver.TCPSocket leaks socket to garbage collector if 
server_bind() fails
type: resource usage
versions: Python 3.4

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue22435>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to