diff options
author | Kamil Rytarowski <n54@gmx.com> | 2018-01-23 22:41:47 +0000 |
---|---|---|
committer | Kamil Rytarowski <n54@gmx.com> | 2018-01-23 22:41:47 +0000 |
commit | 2fbd5f8be24f33ba6fcf66034dbf826bc4903f7b (patch) | |
tree | ac56e6e6ab80be8f00f079c7878ef0094f0824bb /test/sanitizer_common | |
parent | ca36f162027724010e2a26f2b82bb3955483a45f (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.cc | 74 |
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; +} |