Skip to content

Commit

Permalink
bpo-30378: Fix the problem that SysLogHandler can't handle IPv6 addre…
Browse files Browse the repository at this point in the history
…sses (#1676) (#1903)
  • Loading branch information
zhangyangyu committed Jun 1, 2017
1 parent 9d752aa commit 95b4da2
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 7 deletions.
25 changes: 20 additions & 5 deletions Lib/logging/handlers.py
Expand Up @@ -827,11 +827,26 @@ def __init__(self, address=('localhost', SYSLOG_UDP_PORT),
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
Expand Down Expand Up @@ -870,7 +885,7 @@ def encodePriority(self, facility, priority):
priority = self.priority_names[priority]
return (facility << 3) | priority

def close (self):
def close(self):
"""
Closes the socket.
"""
Expand Down
22 changes: 20 additions & 2 deletions Lib/test/test_logging.py
Expand Up @@ -1663,7 +1663,7 @@ def setUp(self):
server.ready.wait()
hcls = logging.handlers.SysLogHandler
if isinstance(server.server_address, tuple):
self.sl_hdlr = hcls(('localhost', server.port))
self.sl_hdlr = hcls((server.server_address[0], server.port))
else:
self.sl_hdlr = hcls(server.server_address)
self.log_output = ''
Expand Down Expand Up @@ -1723,6 +1723,24 @@ def tearDown(self):
SysLogHandlerTest.tearDown(self)
support.unlink(self.address)

@unittest.skipUnless(support.IPV6_ENABLED,
'IPv6 support required for this test.')
@unittest.skipUnless(threading, 'Threading required for this test.')
class IPv6SysLogHandlerTest(SysLogHandlerTest):

"""Test for SysLogHandler with IPv6 host."""

server_class = TestUDPServer
address = ('::1', 0)

def setUp(self):
self.server_class.address_family = socket.AF_INET6
super(IPv6SysLogHandlerTest, self).setUp()

def tearDown(self):
self.server_class.address_family = socket.AF_INET
super(IPv6SysLogHandlerTest, self).tearDown()

@unittest.skipUnless(threading, 'Threading required for this test.')
class HTTPHandlerTest(BaseTest):
"""Test for HTTPHandler."""
Expand Down Expand Up @@ -4378,7 +4396,7 @@ def test_main():
QueueHandlerTest, ShutdownTest, ModuleLevelMiscTest, BasicConfigTest,
LoggerAdapterTest, LoggerTest, SMTPHandlerTest, FileHandlerTest,
RotatingFileHandlerTest, LastResortTest, LogRecordTest,
ExceptionTest, SysLogHandlerTest, HTTPHandlerTest,
ExceptionTest, SysLogHandlerTest, IPv6SysLogHandlerTest, HTTPHandlerTest,
NTEventLogHandlerTest, TimedRotatingFileHandlerTest,
UnixSocketHandlerTest, UnixDatagramHandlerTest, UnixSysLogHandlerTest,
MiscTestCase
Expand Down
3 changes: 3 additions & 0 deletions Misc/NEWS
Expand Up @@ -45,6 +45,9 @@ Core and Builtins
Library
-------

- bpo-30378: Fix the problem that logging.handlers.SysLogHandler cannot
handle IPv6 addresses.

- bpo-29960: Preserve generator state when _random.Random.setstate()
raises an exception. Patch by Bryan Olson.

Expand Down

0 comments on commit 95b4da2

Please sign in to comment.