brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.7 KiB · e5b8f93 Raw
66 lines · cpp
1// Test fopencookie interceptor.2// RUN: %clangxx_msan -std=c++11 -O0 %s -o %t && %run %t3// RUN: %clangxx_msan -std=c++11 -fsanitize-memory-track-origins -O0 %s -o %t && %run %t4 5#include <assert.h>6#include <pthread.h>7#include <stdint.h>8#include <stdio.h>9#include <stdlib.h>10#include <string.h>11 12#include <sanitizer/msan_interface.h>13 14constexpr uintptr_t kMagicCookie = 0x12345678;15 16static ssize_t cookie_read(void *cookie, char *buf, size_t size) {17  assert((uintptr_t)cookie == kMagicCookie);18  memset(buf, 0, size);19  return 0;20}21 22static ssize_t cookie_write(void *cookie, const char *buf, size_t size) {23  assert((uintptr_t)cookie == kMagicCookie);24  __msan_check_mem_is_initialized(buf, size);25  return 0;26}27 28static int cookie_seek(void *cookie, off64_t *offset, int whence) {29  assert((uintptr_t)cookie == kMagicCookie);30  __msan_check_mem_is_initialized(offset, sizeof(*offset));31  return 0;32}33 34static int cookie_close(void *cookie) {35  assert((uintptr_t)cookie == kMagicCookie);36  return 0;37}38 39void PoisonStack() { char a[8192]; }40 41void TestPoisonStack() {42  // Verify that PoisonStack has poisoned the stack - otherwise this test is not43  // testing anything.44  char a;45  assert(__msan_test_shadow(&a - 1000, 1) == 0);46}47 48int main() {49  void *cookie = (void *)kMagicCookie;50  FILE *f = fopencookie(cookie, "rw",51                        {cookie_read, cookie_write, cookie_seek, cookie_close});52  PoisonStack();53  TestPoisonStack();54  fseek(f, 100, SEEK_SET);55  char buf[50];56  fread(buf, 50, 1, f);57  fwrite(buf, 50, 1, f);58  fclose(f);59 60  f = fopencookie(cookie, "rw", {nullptr, nullptr, nullptr, nullptr});61  fseek(f, 100, SEEK_SET);62  fread(buf, 50, 1, f);63  fwrite(buf, 50, 1, f);64  fclose(f);65}66