diff options
author | Dmitry Torokhov <dtor@chromium.org> | 2018-03-01 14:26:49 -0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2018-03-02 22:22:43 -0800 |
commit | aa83c173593e6e72c8ec5121550418efb533dadd (patch) | |
tree | e08a5de2ff230f62b5dfb7586677d4431fa0299d | |
parent | 43724a239b057e48eefd29489c57fd08cdfa8b8f (diff) | |
download | crosvm-aa83c173593e6e72c8ec5121550418efb533dadd.tar crosvm-aa83c173593e6e72c8ec5121550418efb533dadd.tar.gz crosvm-aa83c173593e6e72c8ec5121550418efb533dadd.tar.bz2 crosvm-aa83c173593e6e72c8ec5121550418efb533dadd.tar.lz crosvm-aa83c173593e6e72c8ec5121550418efb533dadd.tar.xz crosvm-aa83c173593e6e72c8ec5121550418efb533dadd.tar.zst crosvm-aa83c173593e6e72c8ec5121550418efb533dadd.zip |
sys_util: register_signal_handler should use SA_RESTART
On Linux, signal handlers installed with signal() will restart interrupted system calls. When we moved to using sigaction() we forgot to specify SA_RESTART and so we started experiencing returns from read write system calls with EINTR, which throws off some of the code. Instead of sprinkling "handle_eintr" everywhere, let's restore the old behavior. TEST=cargo test --features plugin; cargo test -p sys_util BUG=chromium:800626 Change-Id: I24c23069ad4c9e7be8c484ee4c57f67451a2944d Signed-off-by: Dmitry Torokhov <dtor@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/944848 Reviewed-by: Zach Reizner <zachr@chromium.org>
-rw-r--r-- | sys_util/src/signal.rs | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/sys_util/src/signal.rs b/sys_util/src/signal.rs index 5b256c8..5196e20 100644 --- a/sys_util/src/signal.rs +++ b/sys_util/src/signal.rs @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -use libc::{c_int, sigaction, timespec, +use libc::{c_int, sigaction, SA_RESTART, timespec, sigset_t, siginfo_t, sigaddset, sigemptyset, sigismember, sigpending, sigtimedwait, pthread_t, pthread_kill, pthread_sigmask, @@ -75,6 +75,7 @@ pub unsafe fn register_signal_handler( } let mut sigact: sigaction = mem::zeroed(); + sigact.sa_flags = SA_RESTART; sigact.sa_sigaction = handler as *const () as usize; let ret = sigaction(num, &sigact, null_mut()); |