From b5c1be1a42810f7c7c3becdbaa1a93f69372645d Mon Sep 17 00:00:00 2001 From: Christian Bewernitz Date: Tue, 11 Oct 2022 04:48:01 +0200 Subject: [PATCH] fix: Avoid iterating over prototype properties by adding `hasOwnProperty` checks. https://github.com/xmldom/xmldom/issues/436 --- lib/dom.js | 24 ++++++++++++++---------- lib/sax.js | 22 ++++++++++++++++------ 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/lib/dom.js b/lib/dom.js index 0bc123eaf..088cc621c 100644 --- a/lib/dom.js +++ b/lib/dom.js @@ -64,7 +64,9 @@ function arrayIncludes (list) { function copy(src,dest){ for(var p in src){ - dest[p] = src[p]; + if (Object.prototype.hasOwnProperty.call(src, p)) { + dest[p] = src[p]; + } } } @@ -553,9 +555,9 @@ Node.prototype = { //console.dir(map) if(map){ for(var n in map){ - if(map[n] == namespaceURI){ - return n; - } + if (Object.prototype.hasOwnProperty.call(map, n) && map[n] === namespaceURI) { + return n; + } } } el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode; @@ -569,7 +571,7 @@ Node.prototype = { var map = el._nsMap; //console.dir(map) if(map){ - if(prefix in map){ + if(Object.prototype.hasOwnProperty.call(map, prefix)){ return map[prefix] ; } } @@ -1608,11 +1610,13 @@ function importNode(doc,node,deep){ // attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,}; function cloneNode(doc,node,deep){ var node2 = new node.constructor(); - for(var n in node){ - var v = node[n]; - if(typeof v != 'object' ){ - if(v != node2[n]){ - node2[n] = v; + for (var n in node) { + if (Object.prototype.hasOwnProperty.call(node, n)) { + var v = node[n]; + if (typeof v != "object") { + if (v != node2[n]) { + node2[n] = v; + } } } } diff --git a/lib/sax.js b/lib/sax.js index 48d8cfe46..005f2e7a3 100644 --- a/lib/sax.js +++ b/lib/sax.js @@ -142,8 +142,10 @@ function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){ if(endIgnoreCaseMach){ domBuilder.endElement(config.uri,config.localName,tagName); if(localNSMap){ - for(var prefix in localNSMap){ - domBuilder.endPrefixMapping(prefix) ; + for (var prefix in localNSMap) { + if (Object.prototype.hasOwnProperty.call(localNSMap, prefix)) { + domBuilder.endPrefixMapping(prefix); + } } } if(!endMatch){ @@ -493,8 +495,10 @@ function appendElement(el,domBuilder,currentNSMap){ if(el.closed){ domBuilder.endElement(ns,localName,tagName); if(localNSMap){ - for(prefix in localNSMap){ - domBuilder.endPrefixMapping(prefix) + for (prefix in localNSMap) { + if (Object.prototype.hasOwnProperty.call(localNSMap, prefix)) { + domBuilder.endPrefixMapping(prefix); + } } } }else{ @@ -536,9 +540,15 @@ function fixSelfClosed(source,elStartEnd,tagName,closeMap){ return pos