From 373dcc8d5ee1bb387b54630a12b8de37837dfd15 Mon Sep 17 00:00:00 2001 From: Martin von Gagern Date: Sat, 2 Jan 2016 17:35:52 +0100 Subject: [PATCH] Stop stealing documents Stealing documents can have adverse effects since there might be JavaScript node objects referencing the xml document (using the _private member of the xmlElement structure). If we steal such a document, things can break in many places since ownership becomes inconsistent. --- src/node_libxslt.cc | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/node_libxslt.cc b/src/node_libxslt.cc index 6518522..c67ce53 100644 --- a/src/node_libxslt.cc +++ b/src/node_libxslt.cc @@ -15,22 +15,16 @@ using namespace v8; -// Assume ownership of the input document at the libxml level. -// The libxmljs object will be modified so it now represents an empty document. -static xmlDoc* stealDocument(Local input) { +static xmlDoc* copyDocument(Local input) { libxmljs::XmlDocument* docWrapper = Nan::ObjectWrap::Unwrap(input->ToObject()); xmlDoc* stylesheetDoc = docWrapper->xml_obj; - xmlDoc* dummyDoc = xmlNewDoc((const xmlChar*)"1.0"); - stylesheetDoc->_private = NULL; - dummyDoc->_private = docWrapper; - docWrapper->xml_obj = dummyDoc; - return stylesheetDoc; + return xmlCopyDoc(stylesheetDoc, true); } NAN_METHOD(StylesheetSync) { Nan::HandleScope scope; - xmlDoc* doc = stealDocument(info[0]); + xmlDoc* doc = copyDocument(info[0]); xsltStylesheetPtr stylesheet = xsltParseStylesheetDoc(doc); // TODO fetch actual error. if (!stylesheet) { @@ -83,7 +77,7 @@ class StylesheetWorker : public Nan::AsyncWorker { NAN_METHOD(StylesheetAsync) { Nan::HandleScope scope; - xmlDoc* doc = stealDocument(info[0]); + xmlDoc* doc = copyDocument(info[0]); Nan::Callback *callback = new Nan::Callback(info[1].As()); StylesheetWorker* worker = new StylesheetWorker(doc, callback); Nan::AsyncQueueWorker(worker);