summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorArseny Kapoulkine <arseny.kapoulkine@gmail.com>2014-11-05 09:32:52 +0100
committerArseny Kapoulkine <arseny.kapoulkine@gmail.com>2014-11-05 09:32:52 +0100
commitaa1a61c59f2064592d3000a241b01f7ff4bbe0a8 (patch)
tree82a4464f6219b9389c1f34471afb4aa1d1b33bc5 /src
parentab12b30c838fd95f1bc8f6fb15ba2380294aec41 (diff)
Fix xml_node::offset_debug for corner cases
Computed offsets for documents with nodes that were added using append_buffer or newly appended nodes without name/value information were invalid.
Diffstat (limited to 'src')
-rw-r--r--src/pugixml.cpp8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/pugixml.cpp b/src/pugixml.cpp
index 973cfd6..3fe492b 100644
--- a/src/pugixml.cpp
+++ b/src/pugixml.cpp
@@ -5402,8 +5402,8 @@ namespace pugi
impl::xml_document_struct& doc = impl::get_document(_root);
- const char_t* buffer = doc.buffer;
- if (!buffer) return -1;
+ // we can determine the offset reliably only if there is exactly once parse buffer
+ if (!doc.buffer || doc.extra_buffers) return -1;
switch (type())
{
@@ -5413,13 +5413,13 @@ namespace pugi
case node_element:
case node_declaration:
case node_pi:
- return (_root->header & impl::xml_memory_page_name_allocated_or_shared_mask) ? -1 : _root->name - buffer;
+ return _root->name && (_root->header & impl::xml_memory_page_name_allocated_or_shared_mask) == 0 ? _root->name - doc.buffer : -1;
case node_pcdata:
case node_cdata:
case node_comment:
case node_doctype:
- return (_root->header & impl::xml_memory_page_value_allocated_or_shared_mask) ? -1 : _root->value - buffer;
+ return _root->value && (_root->header & impl::xml_memory_page_value_allocated_or_shared_mask) == 0 ? _root->value - doc.buffer : -1;
default:
return -1;