Ver código fonte

Kernel: Preserve pending signals across execve(2)s

As required by posix. Also rename Thread::clear_signals to
Thread::reset_signals_for_exec since it doesn't actually clear any
pending signals, but rather does execve related signal book-keeping.
Idan Horowitz 3 anos atrás
pai
commit
81a76a30a1
3 arquivos alterados com 4 adições e 4 exclusões
  1. 1 1
      Kernel/Syscalls/execve.cpp
  2. 2 2
      Kernel/Thread.cpp
  3. 1 1
      Kernel/Thread.h

+ 1 - 1
Kernel/Syscalls/execve.cpp

@@ -524,7 +524,7 @@ ErrorOr<void> Process::do_exec(NonnullRefPtr<OpenFileDescription> main_program_d
         property = {};
         property = {};
 
 
     auto* current_thread = Thread::current();
     auto* current_thread = Thread::current();
-    current_thread->clear_signals();
+    current_thread->reset_signals_for_exec();
 
 
     clear_futex_queues_on_exec();
     clear_futex_queues_on_exec();
 
 

+ 2 - 2
Kernel/Thread.cpp

@@ -678,11 +678,11 @@ u32 Thread::signal_mask_block(sigset_t signal_set, bool block)
     return previous_signal_mask;
     return previous_signal_mask;
 }
 }
 
 
-void Thread::clear_signals()
+void Thread::reset_signals_for_exec()
 {
 {
     SpinlockLocker lock(g_scheduler_lock);
     SpinlockLocker lock(g_scheduler_lock);
     // The signal mask is preserved across execve(2).
     // The signal mask is preserved across execve(2).
-    m_pending_signals = 0;
+    // The pending signal set is preserved across an execve(2).
     m_have_any_unmasked_pending_signals.store(false, AK::memory_order_release);
     m_have_any_unmasked_pending_signals.store(false, AK::memory_order_release);
     m_signal_action_data.fill({});
     m_signal_action_data.fill({});
     // A successful call to execve(2) removes any existing alternate signal stack
     // A successful call to execve(2) removes any existing alternate signal stack

+ 1 - 1
Kernel/Thread.h

@@ -1010,7 +1010,7 @@ public:
     u32 update_signal_mask(u32 signal_mask);
     u32 update_signal_mask(u32 signal_mask);
     u32 signal_mask_block(sigset_t signal_set, bool block);
     u32 signal_mask_block(sigset_t signal_set, bool block);
     u32 signal_mask() const;
     u32 signal_mask() const;
-    void clear_signals();
+    void reset_signals_for_exec();
 
 
     ErrorOr<FlatPtr> peek_debug_register(u32 register_index);
     ErrorOr<FlatPtr> peek_debug_register(u32 register_index);
     ErrorOr<void> poke_debug_register(u32 register_index, FlatPtr data);
     ErrorOr<void> poke_debug_register(u32 register_index, FlatPtr data);