summaryrefslogtreecommitdiff
path: root/test/sanitizer_common
diff options
context:
space:
mode:
authorKamil Rytarowski <n54@gmx.com>2018-01-23 22:41:47 +0000
committerKamil Rytarowski <n54@gmx.com>2018-01-23 22:41:47 +0000
commit2fbd5f8be24f33ba6fcf66034dbf826bc4903f7b (patch)
treeac56e6e6ab80be8f00f079c7878ef0094f0824bb /test/sanitizer_common
parentca36f162027724010e2a26f2b82bb3955483a45f (diff)
Add a new interceptor: paccept(2)
Summary: paccept(2) is a NetBSD-specific variation of accept(2). Sponsored by <The NetBSD Foundation> Reviewers: joerg, vitalybuka, eugenis Reviewed By: vitalybuka Subscribers: llvm-commits, kubamracek, #sanitizers Tags: #sanitizers Differential Revision: https://reviews.llvm.org/D42052 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@323273 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/sanitizer_common')
-rw-r--r--test/sanitizer_common/TestCases/NetBSD/paccept.cc74
1 files changed, 74 insertions, 0 deletions
diff --git a/test/sanitizer_common/TestCases/NetBSD/paccept.cc b/test/sanitizer_common/TestCases/NetBSD/paccept.cc
new file mode 100644
index 000000000..7d2eb4e85
--- /dev/null
+++ b/test/sanitizer_common/TestCases/NetBSD/paccept.cc
@@ -0,0 +1,74 @@
+// RUN: %clangxx -O0 -g %s -o %t && %run %t
+
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <sys/wait.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+int main(void) {
+ int child;
+ int fd, sfd;
+ socklen_t len;
+ struct sockaddr_in server = {}, client = {};
+ sigset_t set;
+
+ child = fork();
+ if (child == 0) {
+ fd = socket(AF_INET, SOCK_STREAM, 0);
+ if (fd == -1)
+ _exit(1);
+
+ server.sin_family = AF_INET;
+ server.sin_addr.s_addr = INADDR_ANY;
+ server.sin_port = htons(2222);
+
+ if (connect(fd, (struct sockaddr *)&server, sizeof(server)) == -1)
+ _exit(1);
+
+ close(fd);
+
+ _exit(0);
+ }
+
+ fd = socket(AF_INET, SOCK_STREAM, 0);
+ if (fd == -1) {
+ kill(child, SIGKILL);
+ wait(NULL);
+ exit(1);
+ }
+
+ server.sin_family = AF_INET;
+ server.sin_addr.s_addr = INADDR_ANY;
+ server.sin_port = htons(2222);
+
+ if (bind(fd, (const struct sockaddr *)&server, sizeof(server)) == -1) {
+ kill(child, SIGKILL);
+ wait(NULL);
+ exit(1);
+ }
+
+ listen(fd, 3);
+
+ if (sigemptyset(&set) == -1) {
+ kill(child, SIGKILL);
+ wait(NULL);
+ exit(1);
+ }
+
+ len = sizeof(client);
+ sfd = paccept(fd, (struct sockaddr *)&client, &len, &set, SOCK_NONBLOCK);
+ if (sfd == -1) {
+ kill(child, SIGKILL);
+ wait(NULL);
+ exit(1);
+ }
+
+ wait(NULL);
+
+ close(sfd);
+ close(fd);
+
+ return 0;
+}