[compiler-rt] r299885 - [tsan] Fall-back to IPv6 if IPv4 is not available.

Vitaly Buka via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 10 14:03:22 PDT 2017


Author: vitalybuka
Date: Mon Apr 10 16:03:21 2017
New Revision: 299885

URL: http://llvm.org/viewvc/llvm-project?rev=299885&view=rev
Log:
[tsan] Fall-back to IPv6 if IPv4 is not available.

Reviewers: eugenis

Subscribers: kubamracek, llvm-commits

Differential Revision: https://reviews.llvm.org/D31897

Modified:
    compiler-rt/trunk/test/tsan/fd_socket_connect_norace.cc
    compiler-rt/trunk/test/tsan/fd_socket_norace.cc

Modified: compiler-rt/trunk/test/tsan/fd_socket_connect_norace.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/fd_socket_connect_norace.cc?rev=299885&r1=299884&r2=299885&view=diff
==============================================================================
--- compiler-rt/trunk/test/tsan/fd_socket_connect_norace.cc (original)
+++ compiler-rt/trunk/test/tsan/fd_socket_connect_norace.cc Mon Apr 10 16:03:21 2017
@@ -1,20 +1,24 @@
 // RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s
+#include <arpa/inet.h>
+#include <assert.h>
+#include <netinet/in.h>
 #include <pthread.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <unistd.h>
-#include <sys/types.h>
 #include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
+#include <sys/types.h>
+#include <unistd.h>
 
-struct sockaddr_in addr;
+struct sockaddr_in addr4;
+struct sockaddr_in6 addr6;
+struct sockaddr *addr;
+socklen_t addrlen;
 int X;
 
 void *ClientThread(void *x) {
-  int c = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+  int c = socket(addr->sa_family, SOCK_STREAM, IPPROTO_TCP);
   X = 42;
-  if (connect(c, (struct sockaddr*)&addr, sizeof(addr))) {
+  if (connect(c, addr, addrlen)) {
     perror("connect");
     exit(1);
   }
@@ -23,13 +27,26 @@ void *ClientThread(void *x) {
 }
 
 int main() {
-  int s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
-  addr.sin_family = AF_INET;
-  inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);
-  addr.sin_port = INADDR_ANY;
-  socklen_t len = sizeof(addr);
-  bind(s, (sockaddr*)&addr, len);
-  getsockname(s, (sockaddr*)&addr, &len);
+  addr4.sin_family = AF_INET;
+  addr4.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+  addr4.sin_port = INADDR_ANY;
+  addr = (struct sockaddr *)&addr4;
+  addrlen = sizeof(addr4);
+
+  int s = socket(addr->sa_family, SOCK_STREAM, IPPROTO_TCP);
+  if (s <= 0) {
+    // Try to fall-back to IPv6
+    addr6.sin6_family = AF_INET6;
+    addr6.sin6_addr = in6addr_loopback;
+    addr6.sin6_port = INADDR_ANY;
+    addr = (struct sockaddr *)&addr6;
+    addrlen = sizeof(addr6);
+    s = socket(addr->sa_family, SOCK_STREAM, IPPROTO_TCP);
+  }
+  assert(s > 0);
+
+  bind(s, addr, addrlen);
+  getsockname(s, addr, &addrlen);
   listen(s, 10);
   pthread_t t;
   pthread_create(&t, 0, ClientThread, 0);

Modified: compiler-rt/trunk/test/tsan/fd_socket_norace.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/fd_socket_norace.cc?rev=299885&r1=299884&r2=299885&view=diff
==============================================================================
--- compiler-rt/trunk/test/tsan/fd_socket_norace.cc (original)
+++ compiler-rt/trunk/test/tsan/fd_socket_norace.cc Mon Apr 10 16:03:21 2017
@@ -1,20 +1,24 @@
 // RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s
+#include <arpa/inet.h>
+#include <assert.h>
+#include <netinet/in.h>
 #include <pthread.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <unistd.h>
-#include <sys/types.h>
 #include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
+#include <sys/types.h>
+#include <unistd.h>
 
-struct sockaddr_in addr;
+struct sockaddr_in addr4;
+struct sockaddr_in6 addr6;
+struct sockaddr *addr;
+socklen_t addrlen;
 int X;
 
 void *ClientThread(void *x) {
   X = 42;
-  int c = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
-  if (connect(c, (struct sockaddr*)&addr, sizeof(addr))) {
+  int c = socket(addr->sa_family, SOCK_STREAM, IPPROTO_TCP);
+  if (connect(c, addr, addrlen)) {
     perror("connect");
     exit(1);
   }
@@ -27,13 +31,26 @@ void *ClientThread(void *x) {
 }
 
 int main() {
-  int s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
-  addr.sin_family = AF_INET;
-  inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);
-  addr.sin_port = INADDR_ANY;
-  socklen_t len = sizeof(addr);
-  bind(s, (sockaddr*)&addr, len);
-  getsockname(s, (sockaddr*)&addr, &len);
+  addr4.sin_family = AF_INET;
+  addr4.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+  addr4.sin_port = INADDR_ANY;
+  addr = (struct sockaddr *)&addr4;
+  addrlen = sizeof(addr4);
+
+  int s = socket(addr->sa_family, SOCK_STREAM, IPPROTO_TCP);
+  if (s <= 0) {
+    // Try to fall-back to IPv6
+    addr6.sin6_family = AF_INET6;
+    addr6.sin6_addr = in6addr_loopback;
+    addr6.sin6_port = INADDR_ANY;
+    addr = (struct sockaddr *)&addr6;
+    addrlen = sizeof(addr6);
+    s = socket(addr->sa_family, SOCK_STREAM, IPPROTO_TCP);
+  }
+  assert(s > 0);
+
+  bind(s, addr, addrlen);
+  getsockname(s, addr, &addrlen);
   listen(s, 10);
   pthread_t t;
   pthread_create(&t, 0, ClientThread, 0);




More information about the llvm-commits mailing list