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