mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-23 23:34:48 +00:00
auto merge of #13638 : alexcrichton/rust/fix-windows-tcp-timeout-bug, r=brson
When a uv_tcp_t is closed in libuv, it will still invoke the pending connect_cb, and I thought that it would always call it with ECANCELED, but it turns out that sometimes we'll get a different error code instead. Handle this case by checking to see if the request's data is NULL and bail out if so (the timeout expired).
This commit is contained in:
commit
c03d658f7e
@ -270,7 +270,14 @@ impl TcpWatcher {
|
||||
let req = Request::wrap(req);
|
||||
if status == uvll::ECANCELED { return }
|
||||
|
||||
let cx: &mut Ctx = unsafe { req.get_data() };
|
||||
// Apparently on windows when the handle is closed this callback may
|
||||
// not be invoked with ECANCELED but rather another error code.
|
||||
// Either ways, if the data is null, then our timeout has expired
|
||||
// and there's nothing we can do.
|
||||
let data = unsafe { uvll::get_data_for_req(req.handle) };
|
||||
if data.is_null() { return }
|
||||
|
||||
let cx: &mut Ctx = unsafe { &mut *(data as *mut Ctx) };
|
||||
cx.status = status;
|
||||
match cx.timer {
|
||||
Some(ref mut t) => t.stop(),
|
||||
|
Loading…
Reference in New Issue
Block a user