diff --git a/src/config/pairs.rs b/src/config/pairs.rs index a8c902d..63aa67c 100644 --- a/src/config/pairs.rs +++ b/src/config/pairs.rs @@ -31,11 +31,18 @@ pub fn update_pair(pair: DrivePair) -> Result { /// Entfernt ein Laufwerkspaar per ID. pub fn remove_pair(id: &str) -> Result { - let before_len = load()?.pairs.len(); + // Die "vorher"-Länge wird INNERHALB desselben `modify`-Aufrufs (auf der bereits frisch + // geladenen `cfg`) ermittelt statt über einen separaten, vorgelagerten `load()`-Aufruf: + // zwischen zwei getrennten Aufrufen könnte ein nebenläufiger Schreiber die Paarliste + // ändern, was hier sonst zu einem falschen `PairNotFound` trotz erfolgreichem Entfernen + // (oder umgekehrt) führen könnte. + let removed = std::cell::Cell::new(false); let updated = config_ctdra::modify::(|cfg| { + let before_len = cfg.pairs.len(); cfg.pairs.retain(|p| p.id != id); + removed.set(cfg.pairs.len() != before_len); })?; - if updated.pairs.len() == before_len { + if !removed.get() { return Err(Error::PairNotFound(id.to_string())); } Ok(updated)