diff -r 0b2e199ad088 Lib/test/test_socket.py --- a/Lib/test/test_socket.py Tue Apr 29 11:34:15 2014 -0700 +++ b/Lib/test/test_socket.py Wed Apr 30 14:19:08 2014 +0200 @@ -1809,6 +1809,43 @@ def _testRecvFromNegative(self): self.cli.sendto(MSG, 0, (HOST, self.port)) + +@requireSocket("AF_BLUETOOTH", "SOCK_STREAM", "BTPROTO_RFCOMM") +class BasicBluetoothTest(unittest.TestCase): + def setUp(self): + self.bs = socket.socket(socket.AF_BLUETOOTH, + socket.SOCK_STREAM, + socket.BTPROTO_RFCOMM) + + def tearDown(self): + self.bs.close() + + def test_address_invalid(self): + addr = 'ff:ff:ff:ff:fffa' + msg = '"{addr} is not a valid address.'.format(addr=addr) + with self.assertRaises(OSError, msg=msg) as cm: + self.bs.connect((addr, 1)) + # bad bluetooth address + self.assertIsNone(cm.exception.errno, msg) + + + def test_address_overflow(self): + addr = '{0:x}:10:60:0:AA:08'.format(2 ** (8 * struct.calcsize('I'))) + msg = '"{addr}" is not a valid address.'.format(addr=addr) + with self.assertRaises(OSError, msg=msg) as cm: + self.bs.connect((addr, 3)) + # bad bluetooth address + self.assertIsNone(cm.exception.errno, msg) + + def test_address_valid(self): + addr = 'C0:10:60:AA:36:F8' + msg = '"{addr}" is a valid address.'.format(addr=addr) + with self.assertRaises(OSError, msg=msg) as cm: + self.bs.connect((addr, 1)) + # valid bluetooth address, failing connection + self.assertIsNotNone(cm.exception.errno, msg) + + # Tests for the sendmsg()/recvmsg() interface. Where possible, the # same test code is used with different families and types of socket # (e.g. stream, datagram), and tests using recvmsg() are repeated @@ -5101,6 +5138,7 @@ tests.extend([TIPCTest, TIPCThreadableTest]) tests.extend([BasicCANTest, CANTest]) tests.extend([BasicRDSTest, RDSTest]) + tests.append(BasicBluetoothTest) tests.extend([ CmsgMacroTests, SendmsgUDPTest, diff -r 0b2e199ad088 Modules/socketmodule.c --- a/Modules/socketmodule.c Tue Apr 29 11:34:15 2014 -0700 +++ b/Modules/socketmodule.c Wed Apr 30 14:19:08 2014 +0200 @@ -943,7 +943,7 @@ char ch; int n; - n = sscanf(name, "%X:%X:%X:%X:%X:%X%c", + n = sscanf(name, "%2X:%2X:%2X:%2X:%2X:%2X%c", &b5, &b4, &b3, &b2, &b1, &b0, &ch); if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) { bdaddr->b[0] = b0;