@@ -85,7 +85,8 @@ unsafe fn copy_bytes<'a, 'b, T: ?Sized>(src: &T, dst: &'a mut &'b mut [u8]) {
85
85
}
86
86
87
87
88
- use self :: ffi:: { cmsghdr, msghdr, type_of_cmsg_len, type_of_cmsg_data} ;
88
+ use self :: ffi:: { cmsghdr, msghdr, type_of_cmsg_len, align_of_cmsg_data,
89
+ type_of_msgiov_len, type_of_msg_controllen} ;
89
90
90
91
/// A structure used to make room in a cmsghdr passed to recvmsg. The
91
92
/// size and alignment match that of a cmsghdr followed by a T, but the
@@ -156,17 +157,18 @@ impl<'a> Iterator for CmsgIterator<'a> {
156
157
}
157
158
self . 0 = & buf[ cmsg_align ( cmsg_len) ..] ;
158
159
160
+ let cmsg_data = & buf[ cmsg_align ( sizeof_cmsghdr) ..] ;
159
161
match ( cmsg. cmsg_level , cmsg. cmsg_type ) {
160
162
( SOL_SOCKET , SCM_RIGHTS ) => unsafe {
161
163
Some ( ControlMessage :: ScmRights (
162
164
slice:: from_raw_parts (
163
- & cmsg . cmsg_data as * const _ as * const _ , 1 ) ) )
165
+ cmsg_data. as_ptr ( ) as * const _ , 1 ) ) )
164
166
} ,
165
167
( _, _) => unsafe {
166
168
Some ( ControlMessage :: Unknown ( UnknownCmsg (
167
169
& cmsg,
168
170
slice:: from_raw_parts (
169
- & cmsg . cmsg_data as * const _ as * const _ ,
171
+ cmsg_data. as_ptr ( ) as * const _ ,
170
172
len) ) ) )
171
173
}
172
174
}
@@ -191,7 +193,7 @@ pub enum ControlMessage<'a> {
191
193
pub struct UnknownCmsg < ' a > ( & ' a cmsghdr , & ' a [ u8 ] ) ;
192
194
193
195
fn cmsg_align ( len : usize ) -> usize {
194
- let align_bytes = mem:: size_of :: < type_of_cmsg_data > ( ) - 1 ;
196
+ let align_bytes = mem:: size_of :: < align_of_cmsg_data > ( ) - 1 ;
195
197
( len + align_bytes) & !align_bytes
196
198
}
197
199
@@ -213,8 +215,8 @@ impl<'a> ControlMessage<'a> {
213
215
}
214
216
}
215
217
216
- // Unsafe: start and end of buffer must be size_t-aligned (that is,
217
- // cmsg_align'd). Updates the provided slice; panics if the buffer
218
+ // Unsafe: start and end of buffer must be cmsg_align'd.
219
+ // Updates the provided slice; panics if the buffer
218
220
// is too small.
219
221
unsafe fn encode_into < ' b > ( & self , buf : & mut & ' b mut [ u8 ] ) {
220
222
match * self {
@@ -223,7 +225,6 @@ impl<'a> ControlMessage<'a> {
223
225
cmsg_len : self . len ( ) as type_of_cmsg_len ,
224
226
cmsg_level : SOL_SOCKET ,
225
227
cmsg_type : SCM_RIGHTS ,
226
- cmsg_data : [ ] ,
227
228
} ;
228
229
copy_bytes ( & cmsg, buf) ;
229
230
@@ -287,9 +288,9 @@ pub fn sendmsg<'a>(fd: RawFd, iov: &[IoVec<&'a [u8]>], cmsgs: &[ControlMessage<'
287
288
msg_name : name as * const c_void ,
288
289
msg_namelen : namelen,
289
290
msg_iov : iov. as_ptr ( ) ,
290
- msg_iovlen : iov. len ( ) as size_t ,
291
+ msg_iovlen : iov. len ( ) as type_of_msgiov_len ,
291
292
msg_control : cmsg_ptr,
292
- msg_controllen : capacity as size_t ,
293
+ msg_controllen : capacity as type_of_msg_controllen ,
293
294
msg_flags : 0 ,
294
295
} ;
295
296
let ret = unsafe { ffi:: sendmsg ( fd, & mhdr, flags. bits ( ) ) } ;
@@ -310,9 +311,9 @@ pub fn recvmsg<'a, T>(fd: RawFd, iov: &[IoVec<&mut [u8]>], cmsg_buffer: Option<&
310
311
msg_name : & mut address as * const _ as * const c_void ,
311
312
msg_namelen : mem:: size_of :: < sockaddr_storage > ( ) as socklen_t ,
312
313
msg_iov : iov. as_ptr ( ) as * const IoVec < & [ u8 ] > , // safe cast to add const-ness
313
- msg_iovlen : iov. len ( ) as size_t ,
314
+ msg_iovlen : iov. len ( ) as type_of_msgiov_len ,
314
315
msg_control : msg_control as * const c_void ,
315
- msg_controllen : msg_controllen as size_t ,
316
+ msg_controllen : msg_controllen as type_of_msg_controllen ,
316
317
msg_flags : 0 ,
317
318
} ;
318
319
let ret = unsafe { ffi:: recvmsg ( fd, & mut mhdr, flags. bits ( ) ) } ;
@@ -692,6 +693,8 @@ pub fn shutdown(df: RawFd, how: Shutdown) -> Result<()> {
692
693
693
694
#[ test]
694
695
pub fn test_struct_sizes ( ) {
695
- use nixtest;
696
- nixtest:: assert_size_of :: < sockaddr_storage > ( "sockaddr_storage" ) ;
696
+ use nixtest:: assert_size_of;
697
+ assert_size_of :: < sockaddr_storage > ( "sockaddr_storage" ) ;
698
+ assert_size_of :: < msghdr > ( "msghdr" ) ;
699
+ assert_size_of :: < cmsghdr > ( "cmsghdr" ) ;
697
700
}
0 commit comments