4 #include <sys/kern_control.h>
5 #include <sys/socket.h>
6 #include <sys/sys_domain.h>
9 #include <darwintest.h>
11 /* we should win the race in this window: */
15 connect_race(void *data
)
18 struct sockaddr_ctl sc
= {
19 .sc_id
= 1 /* com.apple.flow-divert */
23 for (n
= 0; n
< NTRIES
; ++n
) {
24 connect(*ps
, (const struct sockaddr
*)&sc
, sizeof(sc
));
30 T_DECL(flow_div_doubleconnect_55917185
, "Bad error path in double-connect for flow_divert_kctl_connect")
34 struct sockaddr_ctl sc
= {
35 .sc_id
= 1 /* com.apple.flow-divert */
41 T_ASSERT_POSIX_ZERO(pthread_create(&t
, NULL
, connect_race
, &s
), NULL
);
44 for (n
= 0; n
< NTRIES
; ++n
) {
45 T_ASSERT_POSIX_SUCCESS(tmp_s
= socket(AF_SYSTEM
, SOCK_DGRAM
, SYSPROTO_CONTROL
), NULL
);
48 * this bind will fail, but that's ok because it initialises
51 bind(tmp_s
, (const struct sockaddr
*)&sc
, sizeof(sc
));
53 /* this is what we're racing the other thread for: */
55 connect(s
, (const struct sockaddr
*)&sc
, sizeof(sc
));
57 T_ASSERT_POSIX_SUCCESS(close(s
), NULL
);
61 T_ASSERT_POSIX_ZERO(pthread_join(t
, NULL
), NULL
);
62 T_PASS("flow_divert_kctl_connect race didn't trigger panic");