From 0df2f74d364826053641395b01c2fcb1345057a9 Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Wed, 6 Jul 2011 14:02:55 -0700 Subject: [PATCH] Add several asserts to tcp_wrap OnAlloc and OnConnection should not be occurring after uv_close was called on the handle. --- src/tcp_wrap.cc | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/tcp_wrap.cc b/src/tcp_wrap.cc index 125b880cf4d..50b584adc8e 100644 --- a/src/tcp_wrap.cc +++ b/src/tcp_wrap.cc @@ -206,9 +206,13 @@ class TCPWrap { HandleScope scope; TCPWrap* wrap = static_cast(handle->data); - assert(&wrap->handle_ == (uv_tcp_t*)handle); + // We should not be getting this callback if someone as already called + // uv_close() on the handle. Since we've destroyed object_ at the same + // time as calling uv_close() we can test for this here. + assert(wrap->object_.IsEmpty() == false); + if (status != 0) { // TODO Handle server error (call onerror?) assert(0); @@ -315,6 +319,11 @@ class TCPWrap { TCPWrap* wrap = static_cast(handle->data); + // We should not be getting this callback if someone as already called + // uv_close() on the handle. Since we've destroyed object_ at the same + // time as calling uv_close() we can test for this here. + assert(wrap->object_.IsEmpty() == false); + // Remove the reference to the slab to avoid memory leaks; Local slab_v = wrap->object_->GetHiddenValue(slab_sym); wrap->object_->SetHiddenValue(slab_sym, v8::Null()); @@ -370,6 +379,9 @@ class TCPWrap { HandleScope scope; + // The request object should still be there. + assert(req_wrap->object_.IsEmpty() == false); + if (status) { SetErrno(uv_last_error().code); } @@ -439,6 +451,9 @@ class TCPWrap { HandleScope scope; + // The request object should still be there. + assert(req_wrap->object_.IsEmpty() == false); + if (status) { SetErrno(uv_last_error().code); } @@ -512,6 +527,9 @@ class TCPWrap { ReqWrap* req_wrap = (ReqWrap*) req->data; TCPWrap* wrap = (TCPWrap*) req->handle->data; + // The request object should still be there. + assert(req_wrap->object_.IsEmpty() == false); + HandleScope scope; if (status) {