1f639882bSTamir Duberstein // Test that ASan doesn't raise false alarm when getsockname and getpeername
2f639882bSTamir Duberstein // are called with addrlen=nullptr;
3f639882bSTamir Duberstein //
4f639882bSTamir Duberstein // RUN: %clangxx %s -o %t && %run %t 2>&1
5f639882bSTamir Duberstein
6f639882bSTamir Duberstein #include <assert.h>
7f639882bSTamir Duberstein #include <errno.h>
8f639882bSTamir Duberstein #include <netinet/in.h>
9f639882bSTamir Duberstein #include <sys/socket.h>
10f639882bSTamir Duberstein
main()11f639882bSTamir Duberstein int main() {
12f639882bSTamir Duberstein const int fd = socket(AF_INET, SOCK_DGRAM, 0);
13f639882bSTamir Duberstein assert(fd >= 0);
14f639882bSTamir Duberstein
15f639882bSTamir Duberstein const sockaddr_in sin = {
16f639882bSTamir Duberstein .sin_family = AF_INET,
17*c65fb0cdSMichał Górny .sin_port = htons(1234),
18f639882bSTamir Duberstein .sin_addr =
19f639882bSTamir Duberstein {
20*c65fb0cdSMichał Górny .s_addr = htonl(INADDR_LOOPBACK),
21f639882bSTamir Duberstein },
22f639882bSTamir Duberstein };
23f639882bSTamir Duberstein assert(connect(fd, reinterpret_cast<const sockaddr *>(&sin), sizeof(sin)) ==
24f639882bSTamir Duberstein 0);
25f639882bSTamir Duberstein
26f639882bSTamir Duberstein errno = 0;
27f639882bSTamir Duberstein assert(getsockname(fd, nullptr, nullptr) == -1);
28f639882bSTamir Duberstein assert(errno == EFAULT);
29f639882bSTamir Duberstein
30f639882bSTamir Duberstein errno = 0;
31f639882bSTamir Duberstein assert(getpeername(fd, nullptr, nullptr) == -1);
32f639882bSTamir Duberstein assert(errno == EFAULT);
33f639882bSTamir Duberstein
34f639882bSTamir Duberstein return 0;
35f639882bSTamir Duberstein }
36