OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2010 The Native Client Authors. All rights reserved. | 2 * Copyright 2010 The Native Client Authors. All rights reserved. |
3 * Use of this source code is governed by a BSD-style license that can | 3 * Use of this source code is governed by a BSD-style license that can |
4 * be found in the LICENSE file. | 4 * be found in the LICENSE file. |
5 */ | 5 */ |
6 | 6 |
7 /* | 7 /* |
8 * NaCl Service Runtime. I/O Descriptor / Handle abstraction. | 8 * NaCl Service Runtime. I/O Descriptor / Handle abstraction. |
9 * Connection capabilities. | 9 * Connection capabilities. |
10 */ | 10 */ |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
93 } | 93 } |
94 | 94 |
95 iovec.iov_base = "c"; | 95 iovec.iov_base = "c"; |
96 iovec.iov_len = 1; | 96 iovec.iov_len = 1; |
97 connect_msg.msg_iov = &iovec; | 97 connect_msg.msg_iov = &iovec; |
98 connect_msg.msg_iovlen = 1; | 98 connect_msg.msg_iovlen = 1; |
99 connect_msg.msg_name = NULL; | 99 connect_msg.msg_name = NULL; |
100 connect_msg.msg_namelen = 0; | 100 connect_msg.msg_namelen = 0; |
101 connect_msg.msg_control = control_buf; | 101 connect_msg.msg_control = control_buf; |
102 connect_msg.msg_controllen = sizeof(control_buf); | 102 connect_msg.msg_controllen = sizeof(control_buf); |
| 103 connect_msg.msg_flags = 0; |
103 | 104 |
104 cmsg = CMSG_FIRSTHDR(&connect_msg); | 105 cmsg = CMSG_FIRSTHDR(&connect_msg); |
105 cmsg->cmsg_len = CMSG_LEN(sizeof(int)); | 106 cmsg->cmsg_len = CMSG_LEN(sizeof(int)); |
106 cmsg->cmsg_level = SOL_SOCKET; | 107 cmsg->cmsg_level = SOL_SOCKET; |
107 cmsg->cmsg_type = SCM_RIGHTS; | 108 cmsg->cmsg_type = SCM_RIGHTS; |
108 /* We use memcpy() rather than assignment through a cast to avoid | 109 /* We use memcpy() rather than assignment through a cast to avoid |
109 strict-aliasing warnings */ | 110 strict-aliasing warnings */ |
110 memcpy(CMSG_DATA(cmsg), &sock_pair[0], sizeof(int)); | 111 memcpy(CMSG_DATA(cmsg), &sock_pair[0], sizeof(int)); |
| 112 /* Set msg_controllen to the actual size of the cmsg. */ |
| 113 connect_msg.msg_controllen = cmsg->cmsg_len; |
111 | 114 |
112 sent = sendmsg(self->connect_fd, &connect_msg, 0); | 115 sent = sendmsg(self->connect_fd, &connect_msg, 0); |
113 NaClClose(sock_pair[0]); | 116 NaClClose(sock_pair[0]); |
114 if (sent != 1) { | 117 if (sent != 1) { |
115 NaClClose(sock_pair[1]); | 118 NaClClose(sock_pair[1]); |
116 return -NACL_ABI_EIO; | 119 return -NACL_ABI_EIO; |
117 } | 120 } |
118 | 121 |
119 connected_socket = malloc(sizeof(*connected_socket)); | 122 connected_socket = malloc(sizeof(*connected_socket)); |
120 if (connected_socket == NULL || | 123 if (connected_socket == NULL || |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 if (!NaClDescCtor(&conn_cap->base)) { | 185 if (!NaClDescCtor(&conn_cap->base)) { |
183 free(conn_cap); | 186 free(conn_cap); |
184 return -NACL_ABI_ENOMEM; | 187 return -NACL_ABI_ENOMEM; |
185 } | 188 } |
186 conn_cap->base.vtbl = &kNaClDescConnCapFdVtbl; | 189 conn_cap->base.vtbl = &kNaClDescConnCapFdVtbl; |
187 conn_cap->connect_fd = *xfer->next_handle; | 190 conn_cap->connect_fd = *xfer->next_handle; |
188 *xfer->next_handle++ = NACL_INVALID_HANDLE; | 191 *xfer->next_handle++ = NACL_INVALID_HANDLE; |
189 *result = &conn_cap->base; | 192 *result = &conn_cap->base; |
190 return 0; | 193 return 0; |
191 } | 194 } |
OLD | NEW |