permchannels: isolate the load-time mode applier in catch_unwind so a panicking mode handler can't leave mode_sudo stuck true — which would silently disable rank/oper gating for every subsequent MODE; the flag is now always reset
This commit is contained in:
parent
14eb982db5
commit
928026c49e
1 changed files with 32 additions and 25 deletions
|
|
@ -89,9 +89,12 @@ fn apply_modes(s: &mut Server, name: &str, key: &str, modes: &str) {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
let args: Vec<&str> = it.collect();
|
let args: Vec<&str> = it.collect();
|
||||||
|
s.mode_sudo = true;
|
||||||
|
// Isolate a panicking mode handler: otherwise it would leave `mode_sudo` stuck
|
||||||
|
// on, silently disabling rank/oper gating for every subsequent MODE.
|
||||||
|
let outcome = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
|
||||||
let mut ai = 0usize;
|
let mut ai = 0usize;
|
||||||
let mut adding = true;
|
let mut adding = true;
|
||||||
s.mode_sudo = true;
|
|
||||||
for c in letters.chars() {
|
for c in letters.chars() {
|
||||||
match c {
|
match c {
|
||||||
'+' => {
|
'+' => {
|
||||||
|
|
@ -118,7 +121,11 @@ fn apply_modes(s: &mut Server, name: &str, key: &str, modes: &str) {
|
||||||
};
|
};
|
||||||
let _ = h.apply(s, name, key, 0, adding, param);
|
let _ = h.apply(s, name, key, 0, adding, param);
|
||||||
}
|
}
|
||||||
|
}));
|
||||||
s.mode_sudo = false;
|
s.mode_sudo = false;
|
||||||
|
if outcome.is_err() {
|
||||||
|
eprintln!("[permchannels] a mode handler panicked applying {name}; skipped its remaining modes");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Recreate one parsed record as a live (member-less) channel.
|
/// Recreate one parsed record as a live (member-less) channel.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue