base: aquire context mutex in local_submit()

Some signal-heavy scenarios (e.g., libc_integration) produced the
following warning that hinted a data race on signal data in the context
object.

  Warning: returning signal with num == 0

The cause was the use of Signal_context::local_submit() in the libc
introduced in

  424ed1b79a4 libc: remove Reconstructible / use local_submit in kernel

in combination with a missing context-mutex aquisition resulting in a
data race on Signal_context::_curr_signal.

Issue #3923
This commit is contained in:
Christian Helmuth 2022-12-05 16:21:26 +01:00
parent 377f2166a1
commit 8661936d7d
2 changed files with 4 additions and 3 deletions

View File

@ -85,7 +85,7 @@ void Signal_receiver::_platform_begin_dissolve(Signal_context * const c)
{
Mutex::Guard context_guard(c->_mutex);
c->_pending = true;
c->_curr_signal = Signal::Data(nullptr, 0);
c->_curr_signal = Signal::Data();
}
Kernel::kill_signal_context(Capability_space::capid(c->_cap));
}
@ -166,7 +166,7 @@ Signal Signal_receiver::pending_signal()
_contexts.head(context._next);
context._pending = false;
result = context._curr_signal;
context._curr_signal = Signal::Data(0, 0);
context._curr_signal = Signal::Data();
Trace::Signal_received trace_event(context, result.num);
return true;

View File

@ -117,6 +117,7 @@ namespace Genode {
void Signal_context::local_submit()
{
if (_receiver) {
Mutex::Guard guard(_mutex);
/* construct and locally submit signal object */
Signal::Data signal(this, 1);
_receiver->local_submit(signal);
@ -261,7 +262,7 @@ Signal Signal_receiver::pending_signal()
_contexts.head(context._next);
context._pending = false;
result = context._curr_signal;
context._curr_signal = Signal::Data(0, 0);
context._curr_signal = Signal::Data();
Trace::Signal_received trace_event(context, result.num);
return true;