diff options
author | Ben Noordhuis <info@bnoordhuis.nl> | 2011-11-10 13:17:49 +0100 |
---|---|---|
committer | Ben Noordhuis <info@bnoordhuis.nl> | 2011-11-10 13:17:51 +0100 |
commit | 8dd4fcbe8f396fbc14a92a30ebb86c781b38e3dd (patch) | |
tree | 3b0134afbf6e62f6cafe5c2f1c06c8ebaed48d37 /src/fs_event_wrap.cc | |
parent | f84d86b66054273fb6a31346f0dd957078b58c1c (diff) | |
download | android-node-v8-8dd4fcbe8f396fbc14a92a30ebb86c781b38e3dd.tar.gz android-node-v8-8dd4fcbe8f396fbc14a92a30ebb86c781b38e3dd.tar.bz2 android-node-v8-8dd4fcbe8f396fbc14a92a30ebb86c781b38e3dd.zip |
fs: don't close uninitialized fs.watch handle
Makes uv_close() assert because the uv_fs_event_t struct contains garbage.
Diffstat (limited to 'src/fs_event_wrap.cc')
-rw-r--r-- | src/fs_event_wrap.cc | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/fs_event_wrap.cc b/src/fs_event_wrap.cc index 0cce45501c..a18a148a55 100644 --- a/src/fs_event_wrap.cc +++ b/src/fs_event_wrap.cc @@ -45,6 +45,7 @@ public: static void Initialize(Handle<Object> target); static Handle<Value> New(const Arguments& args); static Handle<Value> Start(const Arguments& args); + static Handle<Value> Close(const Arguments& args); private: FSEventWrap(Handle<Object> object); @@ -54,16 +55,19 @@ private: int status); uv_fs_event_t handle_; + bool initialized_; }; FSEventWrap::FSEventWrap(Handle<Object> object): HandleWrap(object, (uv_handle_t*)&handle_) { handle_.data = reinterpret_cast<void*>(this); + initialized_ = false; } FSEventWrap::~FSEventWrap() { + assert(initialized_ == false); } @@ -111,6 +115,7 @@ Handle<Value> FSEventWrap::Start(const Arguments& args) { if (!args[1]->IsTrue()) { uv_unref(uv_default_loop()); } + wrap->initialized_ = true; } else { SetErrno(uv_last_error(uv_default_loop())); } @@ -150,6 +155,21 @@ void FSEventWrap::OnEvent(uv_fs_event_t* handle, const char* filename, MakeCallback(wrap->object_, "onchange", 3, argv); } + + +Handle<Value> FSEventWrap::Close(const Arguments& args) { + HandleScope scope; + + UNWRAP + + if (!wrap->initialized_) + return Undefined(); + + wrap->initialized_ = false; + return HandleWrap::Close(args); +} + + } // namespace node NODE_MODULE(node_fs_event_wrap, node::FSEventWrap::Initialize) |