summaryrefslogtreecommitdiff
path: root/src/fs_event_wrap.cc
diff options
context:
space:
mode:
authorBen Noordhuis <info@bnoordhuis.nl>2011-11-10 13:17:49 +0100
committerBen Noordhuis <info@bnoordhuis.nl>2011-11-10 13:17:51 +0100
commit8dd4fcbe8f396fbc14a92a30ebb86c781b38e3dd (patch)
tree3b0134afbf6e62f6cafe5c2f1c06c8ebaed48d37 /src/fs_event_wrap.cc
parentf84d86b66054273fb6a31346f0dd957078b58c1c (diff)
downloadandroid-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.cc20
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)