1c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// RUN: %clangxx_msan %s -DSEND -DPOISON -o %t && not %run %t 2>&1 | FileCheck %s --check-prefix=SEND
2c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// RUN: %clangxx_msan %s -DSENDTO -DPOISON -o %t && not %run %t 2>&1 | FileCheck %s --check-prefix=SENDTO
3c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// RUN: %clangxx_msan %s -DSENDMSG -DPOISON -o %t && not %run %t 2>&1 | FileCheck %s --check-prefix=SENDMSG
4c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
5c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// RUN: %clangxx_msan %s -DSEND -o %t && %run %t 2>&1 | FileCheck %s --check-prefix=NEGATIVE
6c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// RUN: %clangxx_msan %s -DSENDTO -o %t && %run %t 2>&1 | FileCheck %s --check-prefix=NEGATIVE
7c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// RUN: %clangxx_msan %s -DSENDMSG -o %t && %run %t 2>&1 | FileCheck %s --check-prefix=NEGATIVE
8c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
9c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// RUN: %clangxx_msan %s -DSEND -DPOISON -o %t && \
10c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// RUN:   MSAN_OPTIONS=intercept_send=0 %run %t 2>&1 | FileCheck %s --check-prefix=NEGATIVE
11c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// RUN: %clangxx_msan %s -DSENDTO -DPOISON -o %t && \
12c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// RUN:   MSAN_OPTIONS=intercept_send=0 %run %t 2>&1 | FileCheck %s --check-prefix=NEGATIVE
13c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// RUN: %clangxx_msan %s -DSENDMSG -DPOISON -o %t && \
14c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// RUN:   MSAN_OPTIONS=intercept_send=0 %run %t 2>&1 | FileCheck %s --check-prefix=NEGATIVE
15c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
16c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// UNSUPPORTED: android
17c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
18c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#include <assert.h>
19c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#include <stdio.h>
20c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#include <unistd.h>
21c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#include <stdlib.h>
22c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#include <string.h>
23c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#include <netdb.h>
24c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#include <sys/types.h>
25c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#include <sys/socket.h>
26c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#include <sanitizer/msan_interface.h>
27c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
28c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarconst int kBufSize = 10;
29c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarint sockfd;
30c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
31c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarint main() {
32c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  int ret;
33c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  char buf[kBufSize] = {0};
34c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  pthread_t client_thread;
35c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  struct sockaddr_in serveraddr;
36c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
37c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  sockfd = socket(AF_INET, SOCK_DGRAM, 0);
38c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
39c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  memset(&serveraddr, 0, sizeof(serveraddr));
40c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  serveraddr.sin_family = AF_INET;
41c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
42c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  serveraddr.sin_port = 0;
43c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
44c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
45c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  socklen_t addrlen = sizeof(serveraddr);
46c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  getsockname(sockfd, (struct sockaddr *)&serveraddr, &addrlen);
47c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
48c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#if defined(POISON)
49c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  __msan_poison(buf + 7, 1);
50c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#endif
51c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
52c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#if defined(SENDMSG)
53c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  struct iovec iov[2] = {{buf, 5}, {buf + 5, 5}};
54c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  struct msghdr msg;
55c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  msg.msg_name = &serveraddr;
56c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  msg.msg_namelen = addrlen;
57c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  msg.msg_iov = iov;
58c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  msg.msg_iovlen = 2;
59c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  msg.msg_control = 0;
60c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  msg.msg_controllen = 0;
61c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  msg.msg_flags = 0;
62c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#endif
63c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
64c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#if defined(SEND)
65c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  ret = connect(sockfd, (struct sockaddr *)&serveraddr, addrlen);
66c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  assert(ret == 0);
67c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  ret = send(sockfd, buf, kBufSize, 0);
68c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  // SEND: Uninitialized bytes in __interceptor_send at offset 7 inside [{{.*}}, 10)
69c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  assert(ret > 0);
70c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#elif defined(SENDTO)
71c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  ret =
72c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar      sendto(sockfd, buf, kBufSize, 0, (struct sockaddr *)&serveraddr, addrlen);
73c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  // SENDTO: Uninitialized bytes in __interceptor_sendto at offset 7 inside [{{.*}}, 10)
74c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  assert(ret > 0);
75c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#elif defined(SENDMSG)
76c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  ret = sendmsg(sockfd, &msg, 0);
77c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  // SENDMSG: Uninitialized bytes in {{.*}} at offset 2 inside [{{.*}}, 5)
78c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  assert(ret > 0);
79c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#endif
80c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  fprintf(stderr, "== done\n");
81c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  // NEGATIVE: == done
82c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  return 0;
83c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar}
84