mirror of
https://github.com/chromium/crashpad.git
synced 2025-03-09 14:06:33 +00:00
test::Multiprocess: exit cleanly from children with _exit().
Child exits were using exit(), which caused crashes on 10.10 for Multiprocess-based tests that ran after HTTPTransport tests. The crashes occurred while running exit-time destructors. exit() was never correct in this situation, this should have used _exit() all along. TEST=crashpad_util_test BUG=crashpad:17 R=rsesek@chromium.org Review URL: https://codereview.chromium.org/1000653002
This commit is contained in:
parent
b8d2129bc1
commit
b8cbfff0d3
@ -164,9 +164,9 @@ class Multiprocess {
|
|||||||
//! \brief Runs the child side of the test.
|
//! \brief Runs the child side of the test.
|
||||||
//!
|
//!
|
||||||
//! This method establishes the child’s environment, calls
|
//! This method establishes the child’s environment, calls
|
||||||
//! MultiprocessChild(), and exits cleanly. However, if any failure (via fatal
|
//! MultiprocessChild(), and exits cleanly by calling `_exit(0)`. However, if
|
||||||
//! or nonfatal gtest assertion) is detected, the child will exit with a
|
//! any failure (via fatal or nonfatal gtest assertion) is detected, the child
|
||||||
//! failure status.
|
//! will exit with a failure status.
|
||||||
void RunChild();
|
void RunChild();
|
||||||
|
|
||||||
//! \brief The subclass-provided parent routine.
|
//! \brief The subclass-provided parent routine.
|
||||||
@ -186,6 +186,11 @@ class Multiprocess {
|
|||||||
//! `FAIL()`, etc.
|
//! `FAIL()`, etc.
|
||||||
//!
|
//!
|
||||||
//! Subclasses must implement this method to define how the child operates.
|
//! Subclasses must implement this method to define how the child operates.
|
||||||
|
//! Subclasses may exit with a failure status by using `LOG(FATAL)`,
|
||||||
|
//! `abort()`, or similar. They may exit cleanly by returning from this method
|
||||||
|
//! or by calling `_exit(0)`. Under no circumstances may `exit()` be called
|
||||||
|
//! by the child without having the child process `exec()`. Use
|
||||||
|
//! MultiprocessExec if the child should call `exec()`.
|
||||||
virtual void MultiprocessChild() = 0;
|
virtual void MultiprocessChild() = 0;
|
||||||
|
|
||||||
internal::MultiprocessInfo* info_;
|
internal::MultiprocessInfo* info_;
|
||||||
|
@ -212,7 +212,8 @@ void Multiprocess::RunChild() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
exit(0);
|
// In a forked child, exit() is unsafe. Use _exit() instead.
|
||||||
|
_exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace test
|
} // namespace test
|
||||||
|
Loading…
x
Reference in New Issue
Block a user