[compiler-rt] r178464 - [libsanitizer] Run the callback on a separate stack in StopTheWorld.

Sergey Matveev earthdok at google.com
Mon Apr 1 07:44:17 PDT 2013


> Also, move some globals into local scope (they had no business being
global anyway).

Documenting that this refers to a draft version of the patch and is no
longer applicable.


On Mon, Apr 1, 2013 at 6:38 PM, Alexander Potapenko <glider at google.com>wrote:

> Author: glider
> Date: Mon Apr  1 09:38:56 2013
> New Revision: 178464
>
> URL: http://llvm.org/viewvc/llvm-project?rev=178464&view=rev
> Log:
> [libsanitizer] Run the callback on a separate stack in StopTheWorld.
>
> Currently the callback runs on the caller's stack. If this stack
> contains values that have gone out of scope, and we are not super careful,
> those
> values can propagate into global variables (the libc sigaction() in
> particular
> has a side effect that can lead to this). This has caused false negatives
> in
> leak checking code.
>
> Changes: map a separate stack space for the tracer thread. Also, move some
> globals into local scope (they had no business being global anyway).
>
> Patch by Sergey Matveev (earthdok at google.com)
>
> Modified:
>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_stoptheworld_linux.cc
>
> Modified:
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_stoptheworld_linux.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_stoptheworld_linux.cc?rev=178464&r1=178463&r2=178464&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_stoptheworld_linux.cc
> (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_stoptheworld_linux.cc
> Mon Apr  1 09:38:56 2013
> @@ -248,6 +248,30 @@ static int TracerThread(void* argument)
>    return exit_code;
>  }
>
> +class ScopedStackSpaceWithGuard {
> + public:
> +  explicit ScopedStackSpaceWithGuard(uptr stack_size) {
> +    stack_size_ = stack_size;
> +    guard_size_ = GetPageSizeCached();
> +    // FIXME: Omitting MAP_STACK here works in current kernels but might
> break
> +    // in the future.
> +    guard_start_ = (uptr)MmapOrDie(stack_size_ + guard_size_,
> +                                   "ScopedStackWithGuard");
> +    CHECK_EQ(guard_start_, (uptr)Mprotect((uptr)guard_start_,
> guard_size_));
> +  }
> +  ~ScopedStackSpaceWithGuard() {
> +    UnmapOrDie((void *)guard_start_, stack_size_ + guard_size_);
> +  }
> +  void *Bottom() const {
> +    return (void *)(guard_start_ + stack_size_ + guard_size_);
> +  }
> +
> + private:
> +  uptr stack_size_;
> +  uptr guard_size_;
> +  uptr guard_start_;
> +};
> +
>  static sigset_t blocked_sigset;
>  static sigset_t old_sigset;
>  static struct sigaction old_sigactions[ARRAY_SIZE(kUnblockedSignals)];
> @@ -282,16 +306,12 @@ void StopTheWorld(StopTheWorldCallback c
>    struct TracerThreadArgument tracer_thread_argument;
>    tracer_thread_argument.callback = callback;
>    tracer_thread_argument.callback_argument = argument;
> +  const uptr kTracerStackSize = 2 * 1024 * 1024;
> +  ScopedStackSpaceWithGuard tracer_stack(kTracerStackSize);
>    // Block the execution of TracerThread until after we have set ptrace
>    // permissions.
>    tracer_thread_argument.mutex.Lock();
> -  // The tracer thread will run on the same stack, so we must reserve some
> -  // stack space for the caller thread to run in as it waits on the
> tracer.
> -  const uptr kReservedStackSize = 4096;
> -  // Get a 16-byte aligned pointer for stack.
> -  int a_local_variable __attribute__((__aligned__(16)));
> -  pid_t tracer_pid = clone(TracerThread,
> -                          (char *)&a_local_variable - kReservedStackSize,
> +  pid_t tracer_pid = clone(TracerThread, tracer_stack.Bottom(),
>                            CLONE_VM | CLONE_FS | CLONE_FILES |
> CLONE_UNTRACED,
>                            &tracer_thread_argument, 0, 0, 0);
>    if (tracer_pid < 0) {
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130401/fbabc6f8/attachment.html>


More information about the llvm-commits mailing list