Skip to content

Commit 7584dce

Browse files
committed
Fix a very minor race condition in cargo fix.
1 parent 21fe000 commit 7584dce

File tree

1 file changed

+14
-5
lines changed

1 file changed

+14
-5
lines changed

src/cargo/util/diagnostic_server.rs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -258,14 +258,23 @@ impl RustfixDiagnosticServer {
258258

259259
fn run(self, on_message: &dyn Fn(Message), done: &AtomicBool) {
260260
while let Ok((client, _)) = self.listener.accept() {
261-
let client = BufReader::new(client);
262-
match serde_json::from_reader(client) {
263-
Ok(message) => on_message(message),
264-
Err(e) => warn!("invalid diagnostics message: {}", e),
265-
}
266261
if done.load(Ordering::SeqCst) {
267262
break;
268263
}
264+
let mut client = BufReader::new(client);
265+
let mut s = String::new();
266+
if let Err(e) = client.read_to_string(&mut s) {
267+
warn!("diagnostic server failed to read: {}", e);
268+
} else {
269+
match serde_json::from_str(&s) {
270+
Ok(message) => on_message(message),
271+
Err(e) => warn!("invalid diagnostics message: {}", e),
272+
}
273+
}
274+
// The client should be kept alive until after `on_message` is
275+
// called to ensure that the client doesn't exit too soon (and
276+
// Message::Finish getting posted before Message::FixDiagnostic).
277+
drop(client);
269278
}
270279
}
271280
}

0 commit comments

Comments
 (0)