Remove failing thread suspend DCHECK
Removes a failing DCHECK in process_reader_win.cc caused by a race
condition with a thread being injected into a process whose existing
threads are already suspended.
Bug: chromium:1007013
Change-Id: I61b6823e6ec0583e591097cd7d7f55eb88369600
Reviewed-on: https://chromium-review.googlesource.com/c/crashpad/crashpad/+/2047803
Reviewed-by: Mark Mentovai <mark@chromium.org>
Commit-Queue: Brian Sheedy <bsheedy@chromium.org>
GitOrigin-RevId: ff1036aa601703a3c55b8c3fce07295c5acedb9d
diff --git a/snapshot/win/process_reader_win.cc b/snapshot/win/process_reader_win.cc
index 16280e9..51940c0 100644
--- a/snapshot/win/process_reader_win.cc
+++ b/snapshot/win/process_reader_win.cc
@@ -151,11 +151,17 @@
PLOG(ERROR) << "SuspendThread";
return false;
}
- DCHECK(previous_suspend_count > 0 ||
- suspension_state == ProcessSuspensionState::kRunning);
- thread->suspend_count =
- previous_suspend_count -
- (suspension_state == ProcessSuspensionState::kSuspended ? 1 : 0);
+ if (previous_suspend_count <= 0 &&
+ suspension_state == ProcessSuspensionState::kSuspended) {
+ LOG(WARNING) << "Thread " << thread->id
+ << " should be suspended, but previous_suspend_count is "
+ << previous_suspend_count;
+ thread->suspend_count = 0;
+ } else {
+ thread->suspend_count =
+ previous_suspend_count -
+ (suspension_state == ProcessSuspensionState::kSuspended ? 1 : 0);
+ }
memset(&thread->context, 0, sizeof(thread->context));
#if defined(ARCH_CPU_32_BITS)