Skip to content

Commit 3bc3f07

Browse files
committed
Fixed an XML bug leading to an infinite loop + Added xmlns attribute for 'DAV:' presence in a tag name
1 parent aa793d5 commit 3bc3f07

File tree

2 files changed

+15
-10
lines changed

2 files changed

+15
-10
lines changed

lib/helper/XML.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ function seekForNS(node, parentNS) {
2121
}
2222
function mutateNodeNS(node, parentNS) {
2323
if (parentNS === void 0) { parentNS = { _default: 'DAV:' }; }
24+
if (!node)
25+
return;
2426
var nss = seekForNS(node, parentNS);
2527
if (node.name) {
2628
for (var ns in nss) {
@@ -36,14 +38,14 @@ function mutateNodeNS(node, parentNS) {
3638
}
3739
node.findIndex = function (name) {
3840
for (var index = 0; index < node.elements.length; ++index)
39-
if (node.elements[index].name && node.elements[index].name === name)
41+
if (node.elements[index] && node.elements[index].name && node.elements[index].name === name)
4042
return index;
4143
return -1;
4244
};
4345
node.find = function (name) {
4446
for (var _i = 0, _a = node.elements; _i < _a.length; _i++) {
4547
var element = _a[_i];
46-
if (element.name && element.name === name)
48+
if (element && element.name && element.name === name)
4749
return element;
4850
}
4951
throw Errors_1.Errors.XMLNotFound;
@@ -52,7 +54,7 @@ function mutateNodeNS(node, parentNS) {
5254
var elements = [];
5355
for (var _i = 0, _a = node.elements; _i < _a.length; _i++) {
5456
var element = _a[_i];
55-
if (element.name && element.name === name)
57+
if (element && element.name && element.name === name)
5658
elements.push(element);
5759
}
5860
return elements;
@@ -103,11 +105,11 @@ var XML = (function () {
103105
attributes = {};
104106
var li1 = name.lastIndexOf(':');
105107
var li2 = name.indexOf(':');
106-
var lindex = Math.max(li1 === li2 ? -1 : li1, name.lastIndexOf('/')) + 1;
108+
var lindex = Math.max(li1 === li2 && name.indexOf('DAV:') !== 0 ? -1 : li1, name.lastIndexOf('/')) + 1;
107109
if (lindex !== 0) {
108110
var kname = 'a';
109111
var value = name.substring(0, lindex);
110-
while (attributes['xmlns:' + kname] !== undefined || value.indexOf(kname + ':') === -1) {
112+
while (attributes['xmlns:' + kname] !== undefined || value.indexOf(kname + ':') === 0) {
111113
var newChar = kname.charCodeAt(0) + 1;
112114
if (newChar > 'z'.charCodeAt(0))
113115
kname = 'x' + String.fromCharCode(newChar);

src/helper/XML.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ function seekForNS(node : any, parentNS : any) : any
2626

2727
function mutateNodeNS(node : any, parentNS = { _default: 'DAV:' })
2828
{
29+
if(!node)
30+
return;
31+
2932
const nss = seekForNS(node, parentNS);
3033

3134
if(node.name)
@@ -48,14 +51,14 @@ function mutateNodeNS(node : any, parentNS = { _default: 'DAV:' })
4851
node.findIndex = function(name : string) : number
4952
{
5053
for(let index = 0; index < node.elements.length; ++index)
51-
if(node.elements[index].name && node.elements[index].name === name)
54+
if(node.elements[index] && node.elements[index].name && node.elements[index].name === name)
5255
return index;
5356
return -1;
5457
}
5558
node.find = function(name : string) : XMLElement
5659
{
5760
for(const element of node.elements)
58-
if(element.name && element.name === name)
61+
if(element && element.name && element.name === name)
5962
return element;
6063
throw Errors.XMLNotFound;
6164
}
@@ -64,7 +67,7 @@ function mutateNodeNS(node : any, parentNS = { _default: 'DAV:' })
6467
const elements : XMLElement[] = [];
6568

6669
for(const element of node.elements)
67-
if(element.name && element.name === name)
70+
if(element && element.name && element.name === name)
6871
elements.push(element);
6972

7073
return elements;
@@ -139,12 +142,12 @@ export abstract class XML
139142

140143
const li1 = name.lastIndexOf(':');
141144
const li2 = name.indexOf(':');
142-
const lindex = Math.max(li1 === li2 ? -1 : li1, name.lastIndexOf('/')) + 1;
145+
const lindex = Math.max(li1 === li2 && name.indexOf('DAV:') !== 0 ? -1 : li1, name.lastIndexOf('/')) + 1;
143146
if(lindex !== 0)
144147
{
145148
let kname = 'a';
146149
const value = name.substring(0, lindex);
147-
while(attributes['xmlns:' + kname] !== undefined || value.indexOf(kname + ':') === -1)
150+
while(attributes['xmlns:' + kname] !== undefined || value.indexOf(kname + ':') === 0)
148151
{
149152
const newChar = kname.charCodeAt(0) + 1;
150153
if(newChar > 'z'.charCodeAt(0))

0 commit comments

Comments
 (0)