Skip to content

Commit bbd8bec

Browse files
committed
Close #12950: multiprocessing "test_fd_transfer" fails under OpenIndiana
1 parent 54b0149 commit bbd8bec

1 file changed

Lines changed: 23 additions & 11 deletions

File tree

Modules/_multiprocessing/multiprocessing.c

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -86,31 +86,37 @@ ProcessingCtrlHandler(DWORD dwCtrlType)
8686
/* Functions for transferring file descriptors between processes.
8787
Reimplements some of the functionality of the fdcred
8888
module at http://www.mca-ltd.com/resources/fdcred_1.tgz. */
89+
/* Based in http://resin.csoft.net/cgi-bin/man.cgi?section=3&topic=CMSG_DATA */
8990

9091
static PyObject *
9192
multiprocessing_sendfd(PyObject *self, PyObject *args)
9293
{
9394
int conn, fd, res;
94-
char dummy_char;
95-
char buf[CMSG_SPACE(sizeof(int))];
96-
struct msghdr msg = {0};
9795
struct iovec dummy_iov;
96+
char dummy_char;
97+
struct msghdr msg;
9898
struct cmsghdr *cmsg;
99+
union {
100+
struct cmsghdr hdr;
101+
unsigned char buf[CMSG_SPACE(sizeof(int))];
102+
} cmsgbuf;
99103

100104
if (!PyArg_ParseTuple(args, "ii", &conn, &fd))
101105
return NULL;
102106

103107
dummy_iov.iov_base = &dummy_char;
104108
dummy_iov.iov_len = 1;
105-
msg.msg_control = buf;
106-
msg.msg_controllen = sizeof(buf);
109+
110+
memset(&msg, 0, sizeof(msg));
111+
msg.msg_control = &cmsgbuf.buf;
112+
msg.msg_controllen = sizeof(cmsgbuf.buf);
107113
msg.msg_iov = &dummy_iov;
108114
msg.msg_iovlen = 1;
115+
109116
cmsg = CMSG_FIRSTHDR(&msg);
117+
cmsg->cmsg_len = CMSG_LEN(sizeof(int));
110118
cmsg->cmsg_level = SOL_SOCKET;
111119
cmsg->cmsg_type = SCM_RIGHTS;
112-
cmsg->cmsg_len = CMSG_LEN(sizeof(int));
113-
msg.msg_controllen = cmsg->cmsg_len;
114120
* (int *) CMSG_DATA(cmsg) = fd;
115121

116122
Py_BEGIN_ALLOW_THREADS
@@ -127,20 +133,26 @@ multiprocessing_recvfd(PyObject *self, PyObject *args)
127133
{
128134
int conn, fd, res;
129135
char dummy_char;
130-
char buf[CMSG_SPACE(sizeof(int))];
131-
struct msghdr msg = {0};
132136
struct iovec dummy_iov;
137+
struct msghdr msg = {0};
133138
struct cmsghdr *cmsg;
139+
union {
140+
struct cmsghdr hdr;
141+
unsigned char buf[CMSG_SPACE(sizeof(int))];
142+
} cmsgbuf;
134143

135144
if (!PyArg_ParseTuple(args, "i", &conn))
136145
return NULL;
137146

138147
dummy_iov.iov_base = &dummy_char;
139148
dummy_iov.iov_len = 1;
140-
msg.msg_control = buf;
141-
msg.msg_controllen = sizeof(buf);
149+
150+
memset(&msg, 0, sizeof(msg));
151+
msg.msg_control = &cmsgbuf.buf;
152+
msg.msg_controllen = sizeof(cmsgbuf.buf);
142153
msg.msg_iov = &dummy_iov;
143154
msg.msg_iovlen = 1;
155+
144156
cmsg = CMSG_FIRSTHDR(&msg);
145157
cmsg->cmsg_level = SOL_SOCKET;
146158
cmsg->cmsg_type = SCM_RIGHTS;

0 commit comments

Comments
 (0)