changeset: 89312:9ae6f651bc44 tag: tip user: Victor Stinner date: Fri Feb 21 00:17:41 2014 +0100 files: Lib/test/test_socket.py description: try to fix recvmsg() on OpenBS diff -r ad92e63de42c -r 9ae6f651bc44 Lib/test/test_socket.py --- a/Lib/test/test_socket.py Thu Feb 20 23:26:12 2014 +0100 +++ b/Lib/test/test_socket.py Fri Feb 21 00:17:41 2014 +0100 @@ -2820,7 +2820,17 @@ class SCMRightsTest(SendrecvmsgServerTim socket.SCM_RIGHTS, array.array("i", [fd1]))]) - def checkTruncatedHeader(self, result, ignoreflags=0): + def checkTruncatedHeader(self, sock, bufsize, *args, ignoreflags=0): + try: + result = self.doRecvmsg(sock, bufsize, *args) + except OSError as exc: + if hasattr(errno, 'EMSGSIZE') and exc.errno == errno.EMSGSIZE: + # On OpenBSD, if the buffer is too small, recvmsg() fails with + # EMSGSIZE instead of returning partial data + return + else: + raise + # Check that no ancillary data items are returned when data is # truncated inside the cmsghdr structure. msg, ancdata, flags, addr = result @@ -2833,7 +2843,7 @@ class SCMRightsTest(SendrecvmsgServerTim def testCmsgTruncNoBufSize(self): # Check that no ancillary data is received when no buffer size # is specified. - self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)), + self.checkTruncatedHeader(self.serv_sock, len(MSG), # BSD seems to set MSG_CTRUNC only # if an item has been partially # received. @@ -2844,7 +2854,7 @@ class SCMRightsTest(SendrecvmsgServerTim def testCmsgTrunc0(self): # Check that no ancillary data is received when buffer size is 0. - self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0), + self.checkTruncatedHeader(self.serv_sock, len(MSG), 0, ignoreflags=socket.MSG_CTRUNC) def _testCmsgTrunc0(self): @@ -2854,7 +2864,7 @@ class SCMRightsTest(SendrecvmsgServerTim # (but still too small) buffer sizes. def testCmsgTrunc1(self): - self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1)) + self.checkTruncatedHeader(self.serv_sock, len(MSG), 1) def _testCmsgTrunc1(self): self.createAndSendFDs(1) @@ -2863,15 +2873,14 @@ class SCMRightsTest(SendrecvmsgServerTim # The cmsghdr structure has at least three members, two of # which are ints, so we still shouldn't see any ancillary # data. - self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), - SIZEOF_INT * 2)) + self.checkTruncatedHeader(self.serv_sock, len(MSG), SIZEOF_INT * 2) def _testCmsgTrunc2Int(self): self.createAndSendFDs(1) def testCmsgTruncLen0Minus1(self): - self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), - socket.CMSG_LEN(0) - 1)) + self.checkTruncatedHeader(self.serv_sock, len(MSG), + socket.CMSG_LEN(0) - 1) def _testCmsgTruncLen0Minus1(self): self.createAndSendFDs(1) @@ -2884,8 +2893,17 @@ class SCMRightsTest(SendrecvmsgServerTim # mindata and maxdata bytes when received with buffer size # ancbuf, and that any complete file descriptor numbers are # valid. - msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, - len(MSG), ancbuf) + try: + msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, + len(MSG), ancbuf) + except OSError as exc: + if hasattr(errno, 'EMSGSIZE') and exc.errno == errno.EMSGSIZE: + # On OpenBSD, if the buffer is too small, recvmsg() fails with + # EMSGSIZE instead of returning partial data + return + else: + raise + self.assertEqual(msg, MSG) self.checkRecvmsgAddress(addr, self.cli_addr) self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)