Skip to content

Commit af114f7

Browse files
Make Unix socket writeback fixture portable
Signed-off-by: Perfloop Agent <agent@perfloop.ai> Signed-off-by: Tomás Senart <ts@perfloop.ai>
1 parent 633139d commit af114f7

3 files changed

Lines changed: 105 additions & 74 deletions

File tree

‎tests/unit/out/refcount/socket_unix_name.rs‎

Lines changed: 48 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ use std::io::{Read, Seek, Write};
77
use std::os::fd::AsFd;
88
use std::rc::{Rc, Weak};
99
pub fn check_name_0(mut fd: i32, mut path: Ptr<i8>) {
10-
let full: Value<libcc2rs::SockaddrUn> = Rc::new(RefCell::new(Default::default()));
11-
match ({ ((full.as_pointer()) as Ptr<libcc2rs::SockaddrUn>).to_any() },) {
10+
let full: Value<libcc2rs::SockaddrStorage> = Rc::new(RefCell::new(Default::default()));
11+
match ({ ((full.as_pointer()) as Ptr<libcc2rs::SockaddrStorage>).to_any() },) {
1212
(mut __tmp_0,) => {
13-
__tmp_0.memset((165) as u8, 110usize as usize);
13+
__tmp_0.memset((165) as u8, 128usize as usize);
1414
(__tmp_0).clone()
1515
}
1616
};
17-
let actual: Value<libc::socklen_t> = Rc::new(RefCell::new((110usize as libc::socklen_t)));
17+
let actual: Value<libc::socklen_t> = Rc::new(RefCell::new((128usize as libc::socklen_t)));
1818
assert!(
1919
(((match (
2020
{ (full.as_pointer()).reinterpret_cast::<libcc2rs::Sockaddr>() },
@@ -35,19 +35,21 @@ pub fn check_name_0(mut fd: i32, mut path: Ptr<i8>) {
3535
} == 0) as i32)
3636
!= 0)
3737
);
38-
assert!(({ (((({ (*full.borrow()).sun_family } as i32) == 1) as i32) != 0) }));
38+
assert!(({ (((({ (*full.borrow()).ss_family } as i32) == 1) as i32) != 0) }));
39+
assert!(({ (((((*actual.borrow()) as usize) >= 2_usize) as i32) != 0) }));
40+
assert!(({ (((((*actual.borrow()) as usize) < 128usize) as i32) != 0) }));
3941
if !(path).is_null() {
4042
assert!(
41-
(((((array_field_ptr!(full.as_pointer(), sun_path) as Ptr::<i8>) as Ptr<i8>)
43+
(((((array_field_ptr!(
44+
((full.as_pointer()).reinterpret_cast::<libcc2rs::SockaddrUn>()),
45+
sun_path
46+
) as Ptr::<i8>) as Ptr<i8>)
4247
.to_any()
4348
.memcmp(&(path).to_any(), path.to_c_string_iterator().count())
4449
== 0) as i32)
4550
!= 0)
4651
);
47-
} else {
48-
assert!(({ (((((*actual.borrow()) as usize) == 2_usize) as i32) != 0) }));
4952
}
50-
println!("{}", ((*actual.borrow()) as u32));
5153
let mut capacities: [libc::socklen_t; 6] = [
5254
(0 as libc::socklen_t),
5355
(1 as libc::socklen_t),
@@ -64,10 +66,10 @@ pub fn check_name_0(mut fd: i32, mut path: Ptr<i8>) {
6466
!= 0)
6567
{
6668
let out: Value<Box<[u8]>> =
67-
Rc::new(RefCell::new((0..118).map(|_| 0_u8).collect::<Box<[u8]>>()));
69+
Rc::new(RefCell::new((0..136).map(|_| 0_u8).collect::<Box<[u8]>>()));
6870
match ({ ((out.as_pointer() as Ptr<u8>) as Ptr<u8>).to_any() },) {
6971
(mut __tmp_3,) => {
70-
__tmp_3.memset((165) as u8, ::std::mem::size_of::<[u8; 118]>() as usize);
72+
__tmp_3.memset((165) as u8, ::std::mem::size_of::<[u8; 136]>() as usize);
7173
(__tmp_3).clone()
7274
}
7375
};
@@ -102,14 +104,14 @@ pub fn check_name_0(mut fd: i32, mut path: Ptr<i8>) {
102104
(((((out.as_pointer() as Ptr::<u8>) as Ptr<u8>)
103105
.to_any()
104106
.memcmp(
105-
&((full.as_pointer()) as Ptr<libcc2rs::SockaddrUn>).to_any(),
107+
&((full.as_pointer()) as Ptr<libcc2rs::SockaddrStorage>).to_any(),
106108
(copied as usize)
107109
)
108110
== 0) as i32)
109111
!= 0)
110112
);
111113
let mut j: u32 = copied;
112-
'loop_: while ((((j as usize) < ::std::mem::size_of::<[u8; 118]>()) as i32) != 0) {
114+
'loop_: while ((((j as usize) < ::std::mem::size_of::<[u8; 136]>()) as i32) != 0) {
113115
assert!(({ (((((*out.borrow())[(j) as usize] as i32) == 165) as i32) != 0) }));
114116
j.prefix_inc();
115117
}
@@ -150,28 +152,50 @@ fn main_0() -> i32 {
150152
};
151153
assert!((((fd >= 0) as i32) != 0));
152154
({ check_name_0(fd, Ptr::<i8>::null()) });
153-
let addr: Value<libcc2rs::SockaddrUn> = Rc::new(RefCell::new(Default::default()));
154-
match ({ ((addr.as_pointer()) as Ptr<libcc2rs::SockaddrUn>).to_any() },) {
155+
let addr: Value<libcc2rs::SockaddrStorage> = Rc::new(RefCell::new(Default::default()));
156+
match ({ ((addr.as_pointer()) as Ptr<libcc2rs::SockaddrStorage>).to_any() },) {
155157
(mut __tmp_6,) => {
156-
__tmp_6.memset((0) as u8, 110usize as usize);
158+
__tmp_6.memset((0) as u8, 128usize as usize);
157159
(__tmp_6).clone()
158160
}
159161
};
160-
(*addr.borrow_mut()).sun_family = (1 as libc::sa_family_t);
161-
match ({ ((array_field_ptr!(addr.as_pointer(), sun_path) as Ptr<i8>) as Ptr<i8>).to_any() },) {
162-
(mut __tmp_7,) => {
163-
__tmp_7.memcpy(
162+
let len: Value<libc::socklen_t> = Rc::new(RefCell::new((128usize as libc::socklen_t)));
163+
assert!(
164+
(((match (
165+
{ (addr.as_pointer()).reinterpret_cast::<libcc2rs::Sockaddr>() },
166+
{ (len.as_pointer()) },
167+
) {
168+
(mut __tmp_7, mut __tmp_8) => {
169+
match nix::sys::socket::getsockname::<nix::sys::socket::SockaddrStorage>(fd) {
170+
Ok(__ss) => {
171+
Sockaddr::encode(&__ss, &__tmp_7, &__tmp_8);
172+
0
173+
}
174+
Err(__e) => {
175+
libcc2rs::cpp2rust_errno().write(__e as i32);
176+
-1
177+
}
178+
}
179+
}
180+
} == 0) as i32)
181+
!= 0)
182+
);
183+
let mut un: Ptr<libcc2rs::SockaddrUn> =
184+
(addr.as_pointer()).reinterpret_cast::<libcc2rs::SockaddrUn>();
185+
match ({ ((array_field_ptr!(un, sun_path) as Ptr<i8>) as Ptr<i8>).to_any() },) {
186+
(mut __tmp_9,) => {
187+
__tmp_9.memcpy(
164188
&Ptr::<i8>::from_string_literal(b"socket-unix-name").to_any(),
165189
::std::mem::size_of::<[i8; 17]>() as usize,
166190
);
167-
(__tmp_7).clone()
191+
(__tmp_9).clone()
168192
}
169193
};
170194
assert!(
171195
(((match Sockaddr::decode(
172196
&(addr.as_pointer()).reinterpret_cast::<libcc2rs::Sockaddr>(),
173197
(((2_usize as usize).wrapping_add(
174-
(array_field_ptr!(addr.as_pointer(), sun_path) as Ptr::<i8>)
198+
(array_field_ptr!(un, sun_path) as Ptr::<i8>)
175199
.to_c_string_iterator()
176200
.count()
177201
)) as libc::socklen_t)
@@ -190,16 +214,11 @@ fn main_0() -> i32 {
190214
} == 0) as i32)
191215
!= 0)
192216
);
193-
({
194-
check_name_0(
195-
fd,
196-
(array_field_ptr!(addr.as_pointer(), sun_path) as Ptr<i8>),
197-
)
198-
});
217+
({ check_name_0(fd, (array_field_ptr!(un, sun_path) as Ptr<i8>)) });
199218
assert!((((FdRegistry::close(fd) == 0) as i32) != 0));
200219
assert!(
201220
(((match nix::unistd::unlink(
202-
(array_field_ptr!(addr.as_pointer(), sun_path) as Ptr::<i8>)
221+
(array_field_ptr!(un, sun_path) as Ptr::<i8>)
203222
.to_rust_string()
204223
.as_str()
205224
) {

‎tests/unit/out/unsafe/socket_unix_name.rs‎

Lines changed: 42 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -7,34 +7,45 @@ use std::io::{Read, Seek, Write};
77
use std::os::fd::{AsFd, FromRawFd, IntoRawFd};
88
use std::rc::Rc;
99
pub unsafe fn check_name_0(mut fd: i32, mut path: *const libc::c_char) {
10-
let mut full: libc::sockaddr_un = unsafe { std::mem::zeroed() };
11-
match ({ ((&mut full as *mut libc::sockaddr_un) as *mut ::libc::c_void) },) {
10+
let mut full: libc::sockaddr_storage = unsafe { std::mem::zeroed() };
11+
match ({ ((&mut full as *mut libc::sockaddr_storage) as *mut ::libc::c_void) },) {
1212
(mut __tmp_0,) => {
1313
let byte_0 = __tmp_0 as *mut u8;
14-
for offset in 0..::std::mem::size_of::<libc::sockaddr_un>() {
14+
for offset in 0..::std::mem::size_of::<libc::sockaddr_storage>() {
1515
*byte_0.offset(offset as isize) = 165 as u8;
1616
}
1717
__tmp_0
1818
}
1919
};
2020
let mut actual: libc::socklen_t =
21-
(::std::mem::size_of::<libc::sockaddr_un>() as libc::socklen_t);
21+
(::std::mem::size_of::<libc::sockaddr_storage>() as libc::socklen_t);
2222
assert!(
2323
((((libc::getsockname(
2424
fd,
25-
((&mut full as *mut libc::sockaddr_un) as *mut libc::sockaddr),
25+
((&mut full as *mut libc::sockaddr_storage) as *mut libc::sockaddr),
2626
(&mut actual as *mut libc::socklen_t)
2727
)) == (0)) as i32)
2828
!= 0)
2929
);
30-
assert!(((((full.sun_family as i32) == (1)) as i32) != 0));
30+
assert!(((((full.ss_family as i32) == (1)) as i32) != 0));
31+
assert!(
32+
((((actual as usize) >= (::std::mem::offset_of!(libc::sockaddr_un, sun_path))) as i32)
33+
!= 0)
34+
);
35+
assert!(
36+
((((actual as usize) < (::std::mem::size_of::<libc::sockaddr_storage>())) as i32) != 0)
37+
);
3138
if !(path).is_null() {
3239
assert!(
3340
((((match ({ libc::strlen(path) },) {
3441
(mut __tmp_1,) => {
3542
{
3643
let sa = core::slice::from_raw_parts(
37-
(full.sun_path.as_mut_ptr() as *const ::libc::c_void) as *const u8,
44+
((*((&mut full as *mut libc::sockaddr_storage)
45+
as *mut libc::sockaddr_un))
46+
.sun_path
47+
.as_mut_ptr() as *const ::libc::c_void)
48+
as *const u8,
3849
__tmp_1 as usize,
3950
);
4051
let sb = core::slice::from_raw_parts(
@@ -54,18 +65,7 @@ pub unsafe fn check_name_0(mut fd: i32, mut path: *const libc::c_char) {
5465
}) == (0)) as i32)
5566
!= 0)
5667
);
57-
} else {
58-
assert!(
59-
((((actual as usize) == (::std::mem::offset_of!(libc::sockaddr_un, sun_path))) as i32)
60-
!= 0)
61-
);
6268
}
63-
(unsafe {
64-
libc::printf(
65-
(c"%u\n".as_ptr().cast_mut()).cast_const() as *const libc::c_char,
66-
(actual as u32),
67-
)
68-
});
6969
let mut capacities: [libc::socklen_t; 6] = [
7070
(0 as libc::socklen_t),
7171
(1 as libc::socklen_t),
@@ -81,11 +81,11 @@ pub unsafe fn check_name_0(mut fd: i32, mut path: *const libc::c_char) {
8181
as i32)
8282
!= 0)
8383
{
84-
let mut out: [u8; 118] = [0_u8; 118];
84+
let mut out: [u8; 136] = [0_u8; 136];
8585
match ({ (out.as_mut_ptr() as *mut ::libc::c_void) },) {
8686
(mut __tmp_2,) => {
8787
let byte_0 = __tmp_2 as *mut u8;
88-
for offset in 0..::std::mem::size_of::<[u8; 118]>() {
88+
for offset in 0..::std::mem::size_of::<[u8; 136]>() {
8989
*byte_0.offset(offset as isize) = 165 as u8;
9090
}
9191
__tmp_2
@@ -115,7 +115,7 @@ pub unsafe fn check_name_0(mut fd: i32, mut path: *const libc::c_char) {
115115
__tmp_3 as usize,
116116
);
117117
let sb = core::slice::from_raw_parts(
118-
((&mut full as *mut libc::sockaddr_un) as *const ::libc::c_void)
118+
((&mut full as *mut libc::sockaddr_storage) as *const ::libc::c_void)
119119
as *const u8,
120120
__tmp_3 as usize,
121121
);
@@ -133,7 +133,7 @@ pub unsafe fn check_name_0(mut fd: i32, mut path: *const libc::c_char) {
133133
!= 0)
134134
);
135135
let mut j: u32 = copied;
136-
'loop_: while ((((j as usize) < (::std::mem::size_of::<[u8; 118]>())) as i32) != 0) {
136+
'loop_: while ((((j as usize) < (::std::mem::size_of::<[u8; 136]>())) as i32) != 0) {
137137
assert!(((((out[(j) as usize] as i32) == (165)) as i32) != 0));
138138
j.prefix_inc();
139139
}
@@ -150,18 +150,29 @@ unsafe fn main_0() -> i32 {
150150
let mut fd: i32 = libc::socket(1, libc::SOCK_DGRAM, 0);
151151
assert!(((((fd) >= (0)) as i32) != 0));
152152
(unsafe { check_name_0(fd, std::ptr::null()) });
153-
let mut addr: libc::sockaddr_un = unsafe { std::mem::zeroed() };
154-
match ({ ((&mut addr as *mut libc::sockaddr_un) as *mut ::libc::c_void) },) {
153+
let mut addr: libc::sockaddr_storage = unsafe { std::mem::zeroed() };
154+
match ({ ((&mut addr as *mut libc::sockaddr_storage) as *mut ::libc::c_void) },) {
155155
(mut __tmp_4,) => {
156156
let byte_0 = __tmp_4 as *mut u8;
157-
for offset in 0..::std::mem::size_of::<libc::sockaddr_un>() {
157+
for offset in 0..::std::mem::size_of::<libc::sockaddr_storage>() {
158158
*byte_0.offset(offset as isize) = 0 as u8;
159159
}
160160
__tmp_4
161161
}
162162
};
163-
addr.sun_family = (1 as libc::sa_family_t);
164-
match ({ (addr.sun_path.as_mut_ptr() as *mut ::libc::c_void) },) {
163+
let mut len: libc::socklen_t =
164+
(::std::mem::size_of::<libc::sockaddr_storage>() as libc::socklen_t);
165+
assert!(
166+
((((libc::getsockname(
167+
fd,
168+
((&mut addr as *mut libc::sockaddr_storage) as *mut libc::sockaddr),
169+
(&mut len as *mut libc::socklen_t)
170+
)) == (0)) as i32)
171+
!= 0)
172+
);
173+
let mut un: *mut libc::sockaddr_un =
174+
((&mut addr as *mut libc::sockaddr_storage) as *mut libc::sockaddr_un);
175+
match ({ ((*un).sun_path.as_mut_ptr() as *mut ::libc::c_void) },) {
165176
(mut __tmp_5,) => {
166177
if ::std::mem::size_of::<[libc::c_char; 17]>() != 0 {
167178
::std::ptr::copy_nonoverlapping(
@@ -176,16 +187,16 @@ unsafe fn main_0() -> i32 {
176187
assert!(
177188
((((libc::bind(
178189
fd,
179-
((&mut addr as *mut libc::sockaddr_un) as *mut libc::sockaddr).cast_const(),
190+
((&mut addr as *mut libc::sockaddr_storage) as *mut libc::sockaddr).cast_const(),
180191
(((::std::mem::offset_of!(libc::sockaddr_un, sun_path) as usize)
181-
.wrapping_add(libc::strlen((addr.sun_path.as_mut_ptr()).cast_const())))
192+
.wrapping_add(libc::strlen(((*un).sun_path.as_mut_ptr()).cast_const())))
182193
as libc::socklen_t)
183194
)) == (0)) as i32)
184195
!= 0)
185196
);
186-
(unsafe { check_name_0(fd, (addr.sun_path.as_mut_ptr()).cast_const()) });
197+
(unsafe { check_name_0(fd, ((*un).sun_path.as_mut_ptr()).cast_const()) });
187198
assert!(((((libc::close(fd)) == (0)) as i32) != 0));
188-
assert!(((((libc::unlink((addr.sun_path.as_mut_ptr()).cast_const())) == (0)) as i32) != 0));
199+
assert!(((((libc::unlink(((*un).sun_path.as_mut_ptr()).cast_const())) == (0)) as i32) != 0));
189200
return 0;
190201
}
191202
pub unsafe fn __cpp2rust_init_globals() {}

‎tests/unit/socket_unix_name.c‎

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,25 @@
11
#include <assert.h>
22
#include <stddef.h>
3-
#include <stdio.h>
43
#include <string.h>
54
#include <sys/socket.h>
65
#include <sys/un.h>
76
#include <unistd.h>
87

98
static void check_name(int fd, const char *path) {
10-
struct sockaddr_un full;
9+
struct sockaddr_storage full;
1110
memset(&full, 0xa5, sizeof(full));
1211
socklen_t actual = sizeof(full);
1312
assert(getsockname(fd, (struct sockaddr *)&full, &actual) == 0);
14-
assert(full.sun_family == AF_UNIX);
13+
assert(full.ss_family == AF_UNIX);
14+
assert(actual >= offsetof(struct sockaddr_un, sun_path));
15+
assert(actual < sizeof(full));
1516
if (path)
16-
assert(memcmp(full.sun_path, path, strlen(path)) == 0);
17-
else
18-
assert(actual == offsetof(struct sockaddr_un, sun_path));
19-
printf("%u\n", (unsigned)actual);
17+
assert(memcmp(((struct sockaddr_un *)&full)->sun_path, path,
18+
strlen(path)) == 0);
2019

2120
socklen_t capacities[] = {0, 1, 2, actual - 1, actual, actual + 1};
2221
for (unsigned i = 0; i < sizeof(capacities) / sizeof(capacities[0]); ++i) {
23-
unsigned char out[sizeof(struct sockaddr_un) + 8];
22+
unsigned char out[sizeof(struct sockaddr_storage) + 8];
2423
memset(out, 0xa5, sizeof(out));
2524
socklen_t len = capacities[i];
2625
assert(getsockname(fd, (struct sockaddr *)out, &len) == 0);
@@ -37,15 +36,17 @@ int main(void) {
3736
assert(fd >= 0);
3837
check_name(fd, NULL);
3938

40-
struct sockaddr_un addr;
39+
struct sockaddr_storage addr;
4140
memset(&addr, 0, sizeof(addr));
42-
addr.sun_family = AF_UNIX;
43-
memcpy(addr.sun_path, "socket-unix-name", sizeof("socket-unix-name"));
41+
socklen_t len = sizeof(addr);
42+
assert(getsockname(fd, (struct sockaddr *)&addr, &len) == 0);
43+
struct sockaddr_un *un = (struct sockaddr_un *)&addr;
44+
memcpy(un->sun_path, "socket-unix-name", sizeof("socket-unix-name"));
4445
assert(bind(fd, (struct sockaddr *)&addr,
45-
offsetof(struct sockaddr_un, sun_path) + strlen(addr.sun_path)) ==
46+
offsetof(struct sockaddr_un, sun_path) + strlen(un->sun_path)) ==
4647
0);
47-
check_name(fd, addr.sun_path);
48+
check_name(fd, un->sun_path);
4849
assert(close(fd) == 0);
49-
assert(unlink(addr.sun_path) == 0);
50+
assert(unlink(un->sun_path) == 0);
5051
return 0;
5152
}

0 commit comments

Comments
 (0)