[compiler-rt] r340308 - SafeStack: Use correct unsafe stack sizes
Vlad Tsyrklevich via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 21 10:29:01 PDT 2018
Author: vlad.tsyrklevich
Date: Tue Aug 21 10:29:01 2018
New Revision: 340308
URL: http://llvm.org/viewvc/llvm-project?rev=340308&view=rev
Log:
SafeStack: Use correct unsafe stack sizes
Summary:
When deallocating thread stacks, we use one thread's unsafe stack size
to deallocate another thread's unsafe stack; however, the two sizes may
differ. Record an unsafe stack's size in the thread stack linked list.
Reviewers: pcc, eugenis
Reviewed By: eugenis
Subscribers: delcypher, llvm-commits, #sanitizers, kcc
Differential Revision: https://reviews.llvm.org/D51016
Added:
compiler-rt/trunk/test/safestack/pthread-stack-size.c
Modified:
compiler-rt/trunk/lib/safestack/safestack.cc
Modified: compiler-rt/trunk/lib/safestack/safestack.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/safestack/safestack.cc?rev=340308&r1=340307&r2=340308&view=diff
==============================================================================
--- compiler-rt/trunk/lib/safestack/safestack.cc (original)
+++ compiler-rt/trunk/lib/safestack/safestack.cc Tue Aug 21 10:29:01 2018
@@ -152,6 +152,7 @@ static void *thread_start(void *arg) {
struct thread_stack_ll {
struct thread_stack_ll *next;
void *stack_base;
+ size_t size;
pid_t pid;
tid_t tid;
};
@@ -183,7 +184,7 @@ static void thread_cleanup_handler(void
while (*stackp) {
thread_stack_ll *stack = *stackp;
if (stack->pid != pid || TgKill(stack->pid, stack->tid, 0) == -ESRCH) {
- UnmapOrDie(stack->stack_base, unsafe_stack_size + unsafe_stack_guard);
+ UnmapOrDie(stack->stack_base, stack->size);
*stackp = stack->next;
free(stack);
} else
@@ -193,6 +194,7 @@ static void thread_cleanup_handler(void
thread_stack_ll *cur_stack =
(thread_stack_ll *)malloc(sizeof(thread_stack_ll));
cur_stack->stack_base = (char *)unsafe_stack_start - unsafe_stack_guard;
+ cur_stack->size = unsafe_stack_size + unsafe_stack_guard;
cur_stack->pid = pid;
cur_stack->tid = tid;
Added: compiler-rt/trunk/test/safestack/pthread-stack-size.c
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/safestack/pthread-stack-size.c?rev=340308&view=auto
==============================================================================
--- compiler-rt/trunk/test/safestack/pthread-stack-size.c (added)
+++ compiler-rt/trunk/test/safestack/pthread-stack-size.c Tue Aug 21 10:29:01 2018
@@ -0,0 +1,53 @@
+// RUN: %clang_safestack %s -pthread -o %t
+// RUN: %run %t
+
+// Test unsafe stack deallocation with custom stack sizes, in particular ensure
+// that we correctly deallocate small stacks and don't accidentally deallocate
+// adjacent memory.
+
+#include <pthread.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+volatile int step = 0;
+
+void *wait_until(void *ptr) {
+ while ((int)ptr != step)
+ usleep(1000);
+
+ volatile char buf[64];
+ buf[0] = 0;
+
+ return NULL;
+}
+
+int main(int argc, char **argv) {
+ pthread_t t1, t2, t3;
+
+ pthread_attr_t small_stack_attr;
+ pthread_attr_init(&small_stack_attr);
+ pthread_attr_setstacksize(&small_stack_attr, 65536);
+
+ if (pthread_create(&t3, NULL, wait_until, (void *)3))
+ abort();
+ if (pthread_create(&t1, &small_stack_attr, wait_until, (void *)1))
+ abort();
+ if (pthread_create(&t2, NULL, wait_until, (void *)2))
+ abort();
+
+ step = 1;
+ if (pthread_join(t1, NULL))
+ abort();
+
+ step = 2;
+ if (pthread_join(t2, NULL))
+ abort();
+
+ step = 3;
+ if (pthread_join(t3, NULL))
+ abort();
+
+ pthread_attr_destroy(&small_stack_attr);
+ return 0;
+}
More information about the llvm-commits
mailing list