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