From 8749089352114b6e6067dfa8fa0d440083c3c53d Mon Sep 17 00:00:00 2001 From: Witold Filipczyk Date: Tue, 4 Jan 2022 20:02:48 +0100 Subject: [PATCH] [quickjs] Rewritten problematic fragment There was segfault. --- src/ecmascript/quickjs/element.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/ecmascript/quickjs/element.c b/src/ecmascript/quickjs/element.c index 04d9d63a7..c1531fc99 100644 --- a/src/ecmascript/quickjs/element.c +++ b/src/ecmascript/quickjs/element.c @@ -1581,19 +1581,26 @@ js_element_querySelectorAll(JSContext *ctx, JSValueConst this_val, int argc, JSV xmlpp::ustring css = str; xmlpp::ustring xpath = css2xpath(css); JS_FreeCString(ctx, str); - xmlpp::Node::NodeSet *elements = new(std::nothrow) xmlpp::Node::NodeSet; - if (!elements) { + xmlpp::Node::NodeSet elements; + xmlpp::Node::NodeSet *res = new(std::nothrow) xmlpp::Node::NodeSet; + + if (!res) { return JS_NULL; } try { - *elements = el->find(xpath); - } catch (xmlpp::exception) { - } - elements->erase(std::remove_if(elements->begin(), elements->end(), [el](xmlpp::Node *node){return !isAncestor(el, node);})); + elements = el->find(xpath); + } catch (xmlpp::exception) {} - return getCollection(ctx, elements); + for (auto node: elements) + { + if (isAncestor(el, node)) { + res->push_back(node); + } + } + + return getCollection(ctx, res); } static JSValue