Skip to content

Commit 0ba6c04

Browse files
sigprocmask: handle if set is none
* handle the case if `set` is None! Signed-off-by: Andy-Python-Programmer <[email protected]>
1 parent eb7255d commit 0ba6c04

File tree

5 files changed

+43
-33
lines changed

5 files changed

+43
-33
lines changed

patches/mlibc/mlibc.patch

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
From dc0eb6086c635232cf3fee338dbbaa8915938e4e Mon Sep 17 00:00:00 2001
1+
From 4642a80de4f0c967d553e020347cf042d367c381 Mon Sep 17 00:00:00 2001
22
From: Andy-Python-Programmer <[email protected]>
33
Date: Thu, 10 Feb 2022 19:12:25 +1100
44
Subject: [PATCH] yes
@@ -7,9 +7,9 @@ Signed-off-by: Andy-Python-Programmer <[email protected]>
77
---
88
.gitignore | 7 ++++++
99
sysdeps/aero/generic/filesystem.cpp | 34 +++++++++++++++++++++++------
10-
sysdeps/aero/generic/signals.cpp | 14 ++++++++++--
10+
sysdeps/aero/generic/signals.cpp | 8 +++++--
1111
sysdeps/aero/include/aero/syscall.h | 6 +++++
12-
4 files changed, 52 insertions(+), 9 deletions(-)
12+
4 files changed, 46 insertions(+), 9 deletions(-)
1313

1414
diff --git a/.gitignore b/.gitignore
1515
index dbb35e8b..384b3395 100644
@@ -91,22 +91,16 @@ index 6a13f19c..69833ae5 100644
9191
}
9292

9393
diff --git a/sysdeps/aero/generic/signals.cpp b/sysdeps/aero/generic/signals.cpp
94-
index 3527370c..67f23202 100644
94+
index 3527370c..a6f69fff 100644
9595
--- a/sysdeps/aero/generic/signals.cpp
9696
+++ b/sysdeps/aero/generic/signals.cpp
97-
@@ -42,8 +42,18 @@ int sys_sigaction(int how, const struct sigaction *__restrict action,
97+
@@ -42,8 +42,12 @@ int sys_sigaction(int how, const struct sigaction *__restrict action,
9898

9999
int sys_sigprocmask(int how, const sigset_t *__restrict set,
100100
sigset_t *__restrict retrieve) {
101101
- mlibc::infoLogger() << "sys_sigprocmask() is not implemented"
102102
- << frg::endlog;
103-
+ auto old_set = 0;
104-
+
105-
+ if (retrieve) {
106-
+ old_set = reinterpret_cast<sc_word_t>(retrieve);
107-
+ }
108-
+
109-
+ auto result = syscall(SYS_SIGPROCMASK, how, set, old_set);
103+
+ auto result = syscall(SYS_SIGPROCMASK, how, set, retrieve);
110104
+
111105
+ if (result < 0) {
112106
+ return -result;

src/aero_kernel/src/arch/x86_64/signals.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ pub fn interrupt_check_signals(stack: &mut InterruptStack) {
7979
let old_mask = signals.blocked_mask();
8080

8181
let signal_frame = SignalFrame::from_interrupt(stack, old_mask);
82-
signals.set_mask(SigProcMask::Block, 1u64 << signal, None);
82+
signals.set_mask(SigProcMask::Block, Some(1u64 << signal), None);
8383

8484
// We cannot straight away update the stack pointer from the stack
8585
// helper, since it will created a reference to a packed field which
@@ -124,7 +124,7 @@ pub fn syscall_check_signals(syscall_result: isize, stack: &mut InterruptStack)
124124

125125
let signal_frame =
126126
SignalFrame::from_syscall(restart_syscall, syscall_result as _, stack, old_mask);
127-
signals.set_mask(SigProcMask::Block, 1u64 << signal, None);
127+
signals.set_mask(SigProcMask::Block, Some(1u64 << signal), None);
128128

129129
// We cannot straight away update the stack pointer from the stack
130130
// helper, since it will created a reference to a packed field which
@@ -160,7 +160,7 @@ pub fn sigreturn(stack: &mut InterruptStack) -> usize {
160160

161161
current_task.signals().set_mask(
162162
aero_syscall::signal::SigProcMask::Set,
163-
signal_frame.sigmask,
163+
Some(signal_frame.sigmask),
164164
None,
165165
);
166166

src/aero_kernel/src/mem/paging/addr.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ impl VirtAddr {
103103
/// .read_mut::<SomeStruct>();
104104
/// .ok_or(AeroSyscallError::EFAULT)?;
105105
/// ```
106-
pub fn read_mut<'struc, T>(&self) -> Option<&'struc mut T> {
106+
pub fn read_mut<'struc, T: Sized>(&self) -> Option<&'struc mut T> {
107107
if self.validate_read::<T>() {
108108
Some(unsafe { &mut *(self.as_mut_ptr() as *mut T) })
109109
} else {
@@ -113,8 +113,7 @@ impl VirtAddr {
113113

114114
/// Returns if the address is valid to read `sizeof(T)` bytes at the address.
115115
fn validate_read<T: Sized>(&self) -> bool {
116-
*self < crate::arch::task::userland_last_address()
117-
&& (*self + core::mem::size_of::<T>()) <= crate::arch::task::userland_last_address()
116+
(*self + core::mem::size_of::<T>()) <= crate::arch::task::userland_last_address()
118117
}
119118

120119
/// Validate reads `sizeof(T)` bytes from the virtual address and returns a copy
@@ -127,7 +126,7 @@ impl VirtAddr {
127126
/// .ok_or(AeroSyscallError::EFAULT)?;
128127
/// ```
129128
pub fn copied_read<T: Copy + Sized>(&self) -> Option<T> {
130-
self.read_mut().map(|t| *t)
129+
self.read_mut::<T>().map(|t| *t)
131130
}
132131

133132
/// Aligns the virtual address downwards to the given alignment.

src/aero_kernel/src/syscall/process.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -243,9 +243,15 @@ pub fn sethostname(ptr: usize, length: usize) -> Result<usize, AeroSyscallError>
243243
}
244244

245245
pub fn sigprocmask(how: usize, set: usize, old_set: usize) -> Result<usize, AeroSyscallError> {
246-
let set = VirtAddr::new(set as _)
247-
.copied_read::<u64>()
248-
.ok_or(AeroSyscallError::EFAULT)?;
246+
let set = if set > 0 {
247+
Some(
248+
VirtAddr::new(set as _)
249+
.copied_read::<u64>()
250+
.ok_or(AeroSyscallError::EFAULT)?,
251+
)
252+
} else {
253+
None
254+
};
249255

250256
let old_set = if old_set > 0 {
251257
Some(

src/aero_kernel/src/userland/signals.rs

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -390,24 +390,35 @@ impl Signals {
390390
);
391391
}
392392

393-
pub fn set_mask(&self, how: SigProcMask, set: u64, old_set: Option<&mut u64>) {
393+
/// Used to update or read the signal mask of a task.
394+
///
395+
/// ## Notes
396+
/// * If `old_set` is not `None`, the previous value of the signal mask is
397+
/// stored in oldset.
398+
///
399+
/// * NOTE: If `set` is `None`, then the signal mask is unchanged (i.e., `how` is
400+
/// ignored), but the current value of the signal mask is returned in `old_set`
401+
/// (if it is not `None`).
402+
pub fn set_mask(&self, how: SigProcMask, set: Option<u64>, old_set: Option<&mut u64>) {
394403
if let Some(old) = old_set {
395404
*old = self.blocked_mask.load(Ordering::SeqCst);
396405
}
397406

398-
let set = set & !IMMUTABLE_MASK;
407+
if let Some(set) = set {
408+
let set = set & !IMMUTABLE_MASK;
399409

400-
match how {
401-
SigProcMask::Block => {
402-
self.blocked_mask.fetch_or(set, Ordering::SeqCst);
403-
}
410+
match how {
411+
SigProcMask::Block => {
412+
self.blocked_mask.fetch_or(set, Ordering::SeqCst);
413+
}
404414

405-
SigProcMask::Unblock => {
406-
self.blocked_mask.fetch_and(!set, Ordering::SeqCst);
407-
}
415+
SigProcMask::Unblock => {
416+
self.blocked_mask.fetch_and(!set, Ordering::SeqCst);
417+
}
408418

409-
SigProcMask::Set => {
410-
self.blocked_mask.store(set, Ordering::SeqCst);
419+
SigProcMask::Set => {
420+
self.blocked_mask.store(set, Ordering::SeqCst);
421+
}
411422
}
412423
}
413424
}

0 commit comments

Comments
 (0)