Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e4846076 authored by Christopher Ferris's avatar Christopher Ferris
Browse files

Only copy mcontext data from sigcontext.

The ucontext_t data structure could be bigger than the kernel data
structure. Since the unwinder only cares about the mcontext data, only
copy that out of the structure. The mcontext data is the same size in
the kernel and in the ucontext_t structure.

Bug: 15189014
Change-Id: I5978169c4425b8212e11db85a57eb319cd0e264b
parent 818f8004
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -117,6 +117,12 @@ void ThreadEntry::Wake() {
  futex(&futex_, FUTEX_WAKE, INT_MAX, NULL, NULL, 0);
}

void ThreadEntry::CopyUcontextFromSigcontext(void* sigcontext) {
  ucontext_t* ucontext = reinterpret_cast<ucontext_t*>(sigcontext);
  // The only thing the unwinder cares about is the mcontext data.
  memcpy(&ucontext_.uc_mcontext, &ucontext->uc_mcontext, sizeof(ucontext->uc_mcontext));
}

//-------------------------------------------------------------------------
// BacktraceThread functions.
//-------------------------------------------------------------------------
@@ -129,7 +135,7 @@ static void SignalHandler(int, siginfo_t*, void* sigcontext) {
    return;
  }

  entry->CopyUcontext(reinterpret_cast<ucontext_t*>(sigcontext));
  entry->CopyUcontextFromSigcontext(sigcontext);

  // Indicate the ucontext is now valid.
  entry->Wake();
+2 −4
Original line number Diff line number Diff line
@@ -40,14 +40,12 @@ public:

  static void Remove(ThreadEntry* entry);

  inline void CopyUcontext(ucontext_t* ucontext) {
    memcpy(&ucontext_, ucontext, sizeof(ucontext_));
  }

  void Wake();

  void Wait(int);

  void CopyUcontextFromSigcontext(void*);

  inline void Lock() {
    pthread_mutex_lock(&mutex_);
    // Reset the futex value in case of multiple unwinds of the same thread.