1*74989affSNico Weber // Test that ASan doesn't raise false alarm when MSG_TRUNC is present.
2*74989affSNico Weber //
3*74989affSNico Weber // RUN: %clangxx %s -o %t && %run %t 2>&1
4*74989affSNico Weber //
5*74989affSNico Weber // UNSUPPORTED: android
6*74989affSNico Weber
7*74989affSNico Weber #include <stdlib.h>
8*74989affSNico Weber #include <string.h>
9*74989affSNico Weber #include <sys/types.h>
10*74989affSNico Weber #include <sys/socket.h>
11*74989affSNico Weber #include <netinet/ip.h>
12*74989affSNico Weber #include <assert.h>
13*74989affSNico Weber
main()14*74989affSNico Weber int main() {
15*74989affSNico Weber int fd_0 = socket(AF_INET, SOCK_DGRAM, 0);
16*74989affSNico Weber int fd_1 = socket(AF_INET, SOCK_DGRAM, 0);
17*74989affSNico Weber struct sockaddr_in sin;
18*74989affSNico Weber socklen_t len = sizeof(sin);
19*74989affSNico Weber char *buf = (char *)malloc(1);
20*74989affSNico Weber
21*74989affSNico Weber sin.sin_family = AF_INET;
22*74989affSNico Weber // Choose a random port to bind.
23*74989affSNico Weber sin.sin_port = 0;
24*74989affSNico Weber sin.sin_addr.s_addr = INADDR_ANY;
25*74989affSNico Weber
26*74989affSNico Weber assert(bind(fd_1, (struct sockaddr *)&sin, sizeof(sin)) == 0);
27*74989affSNico Weber // Get the address and port binded.
28*74989affSNico Weber assert(getsockname(fd_1, (struct sockaddr *)&sin, &len) == 0);
29*74989affSNico Weber assert(sendto(fd_0, "hello", strlen("hello"), MSG_DONTWAIT,
30*74989affSNico Weber (struct sockaddr *)&sin, sizeof(sin)) != -1);
31*74989affSNico Weber assert(recv(fd_1, buf, 1, MSG_TRUNC) != -1);
32*74989affSNico Weber free(buf);
33*74989affSNico Weber
34*74989affSNico Weber return 0;
35*74989affSNico Weber }
36*74989affSNico Weber
37