Skip to content

Commit 2bca1a9

Browse files
committed
[tsan] Fall-back to IPv6 if IPv4 is not available.
Reviewers: eugenis Subscribers: kubamracek, llvm-commits Differential Revision: https://reviews.llvm.org/D31897 llvm-svn: 299885
1 parent c5e73d6 commit 2bca1a9

File tree

2 files changed

+62
-28
lines changed

2 files changed

+62
-28
lines changed

compiler-rt/test/tsan/fd_socket_connect_norace.cc

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,24 @@
11
// RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s
2+
#include <arpa/inet.h>
3+
#include <assert.h>
4+
#include <netinet/in.h>
25
#include <pthread.h>
36
#include <stdio.h>
47
#include <stdlib.h>
5-
#include <unistd.h>
6-
#include <sys/types.h>
78
#include <sys/socket.h>
8-
#include <netinet/in.h>
9-
#include <arpa/inet.h>
9+
#include <sys/types.h>
10+
#include <unistd.h>
1011

11-
struct sockaddr_in addr;
12+
struct sockaddr_in addr4;
13+
struct sockaddr_in6 addr6;
14+
struct sockaddr *addr;
15+
socklen_t addrlen;
1216
int X;
1317

1418
void *ClientThread(void *x) {
15-
int c = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
19+
int c = socket(addr->sa_family, SOCK_STREAM, IPPROTO_TCP);
1620
X = 42;
17-
if (connect(c, (struct sockaddr*)&addr, sizeof(addr))) {
21+
if (connect(c, addr, addrlen)) {
1822
perror("connect");
1923
exit(1);
2024
}
@@ -23,13 +27,26 @@ void *ClientThread(void *x) {
2327
}
2428

2529
int main() {
26-
int s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
27-
addr.sin_family = AF_INET;
28-
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);
29-
addr.sin_port = INADDR_ANY;
30-
socklen_t len = sizeof(addr);
31-
bind(s, (sockaddr*)&addr, len);
32-
getsockname(s, (sockaddr*)&addr, &len);
30+
addr4.sin_family = AF_INET;
31+
addr4.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
32+
addr4.sin_port = INADDR_ANY;
33+
addr = (struct sockaddr *)&addr4;
34+
addrlen = sizeof(addr4);
35+
36+
int s = socket(addr->sa_family, SOCK_STREAM, IPPROTO_TCP);
37+
if (s <= 0) {
38+
// Try to fall-back to IPv6
39+
addr6.sin6_family = AF_INET6;
40+
addr6.sin6_addr = in6addr_loopback;
41+
addr6.sin6_port = INADDR_ANY;
42+
addr = (struct sockaddr *)&addr6;
43+
addrlen = sizeof(addr6);
44+
s = socket(addr->sa_family, SOCK_STREAM, IPPROTO_TCP);
45+
}
46+
assert(s > 0);
47+
48+
bind(s, addr, addrlen);
49+
getsockname(s, addr, &addrlen);
3350
listen(s, 10);
3451
pthread_t t;
3552
pthread_create(&t, 0, ClientThread, 0);

compiler-rt/test/tsan/fd_socket_norace.cc

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,24 @@
11
// RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s
2+
#include <arpa/inet.h>
3+
#include <assert.h>
4+
#include <netinet/in.h>
25
#include <pthread.h>
36
#include <stdio.h>
47
#include <stdlib.h>
5-
#include <unistd.h>
6-
#include <sys/types.h>
78
#include <sys/socket.h>
8-
#include <netinet/in.h>
9-
#include <arpa/inet.h>
9+
#include <sys/types.h>
10+
#include <unistd.h>
1011

11-
struct sockaddr_in addr;
12+
struct sockaddr_in addr4;
13+
struct sockaddr_in6 addr6;
14+
struct sockaddr *addr;
15+
socklen_t addrlen;
1216
int X;
1317

1418
void *ClientThread(void *x) {
1519
X = 42;
16-
int c = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
17-
if (connect(c, (struct sockaddr*)&addr, sizeof(addr))) {
20+
int c = socket(addr->sa_family, SOCK_STREAM, IPPROTO_TCP);
21+
if (connect(c, addr, addrlen)) {
1822
perror("connect");
1923
exit(1);
2024
}
@@ -27,13 +31,26 @@ void *ClientThread(void *x) {
2731
}
2832

2933
int main() {
30-
int s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
31-
addr.sin_family = AF_INET;
32-
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);
33-
addr.sin_port = INADDR_ANY;
34-
socklen_t len = sizeof(addr);
35-
bind(s, (sockaddr*)&addr, len);
36-
getsockname(s, (sockaddr*)&addr, &len);
34+
addr4.sin_family = AF_INET;
35+
addr4.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
36+
addr4.sin_port = INADDR_ANY;
37+
addr = (struct sockaddr *)&addr4;
38+
addrlen = sizeof(addr4);
39+
40+
int s = socket(addr->sa_family, SOCK_STREAM, IPPROTO_TCP);
41+
if (s <= 0) {
42+
// Try to fall-back to IPv6
43+
addr6.sin6_family = AF_INET6;
44+
addr6.sin6_addr = in6addr_loopback;
45+
addr6.sin6_port = INADDR_ANY;
46+
addr = (struct sockaddr *)&addr6;
47+
addrlen = sizeof(addr6);
48+
s = socket(addr->sa_family, SOCK_STREAM, IPPROTO_TCP);
49+
}
50+
assert(s > 0);
51+
52+
bind(s, addr, addrlen);
53+
getsockname(s, addr, &addrlen);
3754
listen(s, 10);
3855
pthread_t t;
3956
pthread_create(&t, 0, ClientThread, 0);

0 commit comments

Comments
 (0)