@@ -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
9091static PyObject *
9192multiprocessing_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