diff options
author | Xiang Zhang <angwerzx@126.com> | 2017-06-01 14:20:27 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-06-01 14:20:27 (GMT) |
commit | 95b4da2be4aeb74ee46ddece71f2075b32915c60 (patch) | |
tree | f906147f98ac1b3d23152f9ca8724512db6ce11f /Lib/logging | |
parent | 9d752aa5e695d682f3cfc40655580900b132e52a (diff) | |
download | cpython-95b4da2be4aeb74ee46ddece71f2075b32915c60.zip cpython-95b4da2be4aeb74ee46ddece71f2075b32915c60.tar.gz cpython-95b4da2be4aeb74ee46ddece71f2075b32915c60.tar.bz2 |
bpo-30378: Fix the problem that SysLogHandler can't handle IPv6 addresses (#1676) (#1903)
Diffstat (limited to 'Lib/logging')
-rw-r--r-- | Lib/logging/handlers.py | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py index 2356f8d..2f934b3 100644 --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -827,11 +827,26 @@ class SysLogHandler(logging.Handler): self.unixsocket = False if socktype is None: socktype = socket.SOCK_DGRAM - self.socket = socket.socket(socket.AF_INET, socktype) - if socktype == socket.SOCK_STREAM: - self.socket.connect(address) + host, port = address + ress = socket.getaddrinfo(host, port, 0, socktype) + if not ress: + raise OSError("getaddrinfo returns an empty list") + for res in ress: + af, socktype, proto, _, sa = res + err = sock = None + try: + sock = socket.socket(af, socktype, proto) + if socktype == socket.SOCK_STREAM: + sock.connect(sa) + break + except OSError as exc: + err = exc + if sock is not None: + sock.close() + if err is not None: + raise err + self.socket = sock self.socktype = socktype - self.formatter = None def _connect_unixsocket(self, address): use_socktype = self.socktype @@ -870,7 +885,7 @@ class SysLogHandler(logging.Handler): priority = self.priority_names[priority] return (facility << 3) | priority - def close (self): + def close(self): """ Closes the socket. """ |