Branch
Hash :
40f58521
Author :
Date :
2017-05-26T20:16:35
Fix axis traversal from attribute and namespace nodes When traversing the "preceding" axis from an attribute node, we must first go up to the attribute's containing element. Otherwise, text children of other attributes could be returned. This made it possible to hit a code path in xmlXPathNextAncestor which contained another bug: The attribute node was initialized with the context node instead of the current node. Normally, this code path is only hit via xmlXPathNextAncestorOrSelf in which case the current and context node are the same. The combination of the two bugs could result in an infinite loop, found with libFuzzer. Traversing the "following" and the "preceding" axis from namespace nodes should be handled similarly. This wasn't supported at all previously.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
========================
Expression: /child::*
Object is a Node Set :
Set contains 1 nodes:
1 ELEMENT EXAMPLE
ATTRIBUTE prop1
TEXT
content=gnome is great
ATTRIBUTE prop2
TEXT
content=& linux too
========================
Expression: /child::EXAMPLE
Object is a Node Set :
Set contains 1 nodes:
1 ELEMENT EXAMPLE
ATTRIBUTE prop1
TEXT
content=gnome is great
ATTRIBUTE prop2
TEXT
content=& linux too
========================
Expression: /child::EXAMPLE/child::head
Object is a Node Set :
Set contains 1 nodes:
1 ELEMENT head
========================
Expression: /child::EXAMPLE/child::*
Object is a Node Set :
Set contains 2 nodes:
1 ELEMENT head
2 ELEMENT chapter
========================
Expression: /child::EXAMPLE/child::head/child::title
Object is a Node Set :
Set contains 1 nodes:
1 ELEMENT title
========================
Expression: /child::EXAMPLE/child::head/child::title/child::text()
Object is a Node Set :
Set contains 1 nodes:
1 TEXT
content=Welcome to Gnome
========================
Expression: /child::EXAMPLE/child::head/node()
Object is a Node Set :
Set contains 3 nodes:
1 TEXT
content=
2 ELEMENT title
3 TEXT
content=
========================
Expression: /child::EXAMPLE/attribute::prop1/self::node()
Object is a Node Set :
Set contains 1 nodes:
1 ATTRIBUTE prop1
TEXT
content=gnome is great
========================
Expression: /child::EXAMPLE/attribute::prop1/self::*
Object is a Node Set :
Set contains 0 nodes:
========================
Expression: /child::EXAMPLE/attribute::prop1/descendant-or-self::node()
Object is a Node Set :
Set contains 1 nodes:
1 ATTRIBUTE prop1
TEXT
content=gnome is great
========================
Expression: /child::EXAMPLE/attribute::prop1/descendant-or-self::*
Object is a Node Set :
Set contains 0 nodes:
========================
Expression: /child::EXAMPLE/attribute::prop1/ancestor-or-self::node()
Object is a Node Set :
Set contains 3 nodes:
1 /
2 ELEMENT EXAMPLE
ATTRIBUTE prop1
TEXT
content=gnome is great
ATTRIBUTE prop2
TEXT
content=& linux too
3 ATTRIBUTE prop1
TEXT
content=gnome is great
========================
Expression: /child::EXAMPLE/attribute::prop1/ancestor-or-self::*
Object is a Node Set :
Set contains 1 nodes:
1 ELEMENT EXAMPLE
ATTRIBUTE prop1
TEXT
content=gnome is great
ATTRIBUTE prop2
TEXT
content=& linux too
========================
Expression: /descendant::title
Object is a Node Set :
Set contains 2 nodes:
1 ELEMENT title
2 ELEMENT title
========================
Expression: /descendant::p/ancestor::chapter
Object is a Node Set :
Set contains 1 nodes:
1 ELEMENT chapter
========================
Expression: /child::EXAMPLE/attribute::prop2/preceding::text()
Object is a Node Set :
Set contains 0 nodes: