deep_stack_uaf.cc revision 6d924facc5c979a0d25f484cffcdb51c766ed551
16d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany// Check that we can store lots of stack frames if asked to.
26d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany
36d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany// RUN: %clangxx_asan -m64 -O0 %s -o %t 2>&1
46d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany// RUN: ASAN_OPTIONS=malloc_context_size=120:redzone=512 %t 2>&1 | \
56d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany// RUN: %symbolize | FileCheck %s
66d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany
76d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany// RUN: %clangxx_asan -m32 -O0 %s -o %t 2>&1
86d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany// RUN: ASAN_OPTIONS=malloc_context_size=120:redzone=512 %t 2>&1 | \
96d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany// RUN: %symbolize | FileCheck %s
106d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany#include <stdlib.h>
116d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany#include <stdio.h>
126d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany
136d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryanytemplate <int depth>
146d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryanystruct DeepFree {
156d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany  static void free(char *x) {
166d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany    DeepFree<depth - 1>::free(x);
176d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany  }
186d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany};
196d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany
206d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryanytemplate<>
216d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryanystruct DeepFree<0> {
226d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany  static void free(char *x) {
236d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany    ::free(x);
246d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany  }
256d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany};
266d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany
276d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryanyint main() {
286d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany  char *x = new char[10];
296d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany  // deep_free(x);
306d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany  DeepFree<200>::free(x);
316d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany  return x[5];
326d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany  // CHECK: {{.*ERROR: AddressSanitizer heap-use-after-free on address}}
336d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany  // CHECK: DeepFree<36>
346d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany  // CHECK: DeepFree<98>
356d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany  // CHECK: DeepFree<115>
366d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany}
37