12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_msan -m64 -O0 %s -o %t && %run %t
2447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov
3447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov#include <sys/types.h>
4447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov#include <sys/socket.h>
5447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov#include <netdb.h>
6447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov#include <stdlib.h>
7447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov
8447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanovvoid poison_stack_ahead() {
9447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov  char buf[100000];
10447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov  // With -O0 this poisons a large chunk of stack.
11447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov}
12447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov
13447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanovint main(void) {
14447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov  poison_stack_ahead();
15447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov
16447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov  struct addrinfo *ai;
17447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov
18447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov  // This should trigger loading of libnss_dns and friends.
19447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov  // Those libraries are typically uninstrumented.They will call strlen() on a
20447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov  // stack-allocated buffer, which is very likely to be poisoned. Test that we
21447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov  // don't report this as an UMR.
22447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov  int res = getaddrinfo("not-in-etc-hosts", NULL, NULL, &ai);
23447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov  return 0;
24447ef19d1b8cebbeaba49e4be22ac721448dcf3eEvgeniy Stepanov}
25