Avoid a possible deadlock in main_fetch's synchronous code.

On playpen, similar code caused a deadlock on 1.11 stable, and worked fine
on nightly 1.13; it seems safer to avoid the pattern entirely.
This commit is contained in:
Ms2ger 2016-09-23 09:36:02 +02:00
parent fb52bb7c8d
commit ccfd977076

View file

@ -312,7 +312,9 @@ fn main_fetch(request: Rc<Request>, cache: &mut CORSCache, cors_flag: bool,
Data::Done => break, Data::Done => break,
} }
} }
} else if let ResponseBody::Done(ref vec) = *response.body.lock().unwrap() { } else {
let body = response.body.lock().unwrap();
if let ResponseBody::Done(ref vec) = *body {
// in case there was no channel to wait for, the body was // in case there was no channel to wait for, the body was
// obtained synchronously via basic_fetch for data/file/about/etc // obtained synchronously via basic_fetch for data/file/about/etc
// We should still send the body across as a chunk // We should still send the body across as a chunk
@ -320,7 +322,8 @@ fn main_fetch(request: Rc<Request>, cache: &mut CORSCache, cors_flag: bool,
target.process_response_chunk(vec.clone()); target.process_response_chunk(vec.clone());
} }
} else { } else {
assert!(*response.body.lock().unwrap() == ResponseBody::Empty) assert!(*body == ResponseBody::Empty)
}
} }
// overloaded similarly to process_response // overloaded similarly to process_response