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