@@ -11,8 +11,6 @@ mod t {
11
11
12
12
extern "C" {
13
13
pub fn cmsg_firsthdr ( msgh : * const msghdr ) -> * mut cmsghdr ;
14
- // see below
15
- #[ cfg( not( target_arch = "sparc64" ) ) ]
16
14
pub fn cmsg_nxthdr ( mhdr : * const msghdr , cmsg : * const cmsghdr ) -> * mut cmsghdr ;
17
15
pub fn cmsg_space ( length : c_uint ) -> usize ;
18
16
pub fn cmsg_len ( length : c_uint ) -> usize ;
@@ -51,28 +49,24 @@ mod t {
51
49
}
52
50
}
53
51
54
- // Skip on sparc64
55
- // https://github.com/rust-lang/libc/issues/1239
56
- #[ cfg( not( target_arch = "sparc64" ) ) ]
57
52
#[ test]
58
- // FIXME: This triggers alignment checks for pointer dereferences:
59
- // https://github.com/rust-lang/libc/issues/3181
60
- #[ ignore]
61
53
fn test_cmsg_nxthdr ( ) {
62
54
use std:: ptr;
55
+ // Stack alignment helper.
56
+ // Note: on Sparc32, cmsghdr is 8 byte aligned.
57
+ #[ repr( align( 8 ) ) ]
58
+ struct Align8 < T > ( T ) ;
63
59
64
- let mut buffer = [ 0u8 ; 256 ] ;
60
+ let mut buffer = Align8 ( [ 0_u8 ; 260 ] ) ;
65
61
let mut mhdr: msghdr = unsafe { mem:: zeroed ( ) } ;
66
62
let pmhdr = & mhdr as * const msghdr ;
67
63
for start_ofs in 0 ..64 {
68
- let pcmsghdr = & mut buffer[ start_ofs ] as * mut u8 as * mut cmsghdr ;
64
+ let pcmsghdr = & mut buffer. 0 as * mut u8 as * mut cmsghdr ;
69
65
mhdr. msg_control = pcmsghdr as * mut c_void ;
70
66
mhdr. msg_controllen = ( 160 - start_ofs) as _ ;
71
67
for cmsg_len in 0 ..64 {
72
68
for next_cmsg_len in 0 ..32 {
73
- for i in buffer[ start_ofs..] . iter_mut ( ) {
74
- * i = 0 ;
75
- }
69
+ buffer. 0 . fill ( 0 ) ;
76
70
unsafe {
77
71
( * pcmsghdr) . cmsg_len = cmsg_len;
78
72
let libc_next = libc:: CMSG_NXTHDR ( pmhdr, pcmsghdr) ;
0 commit comments