summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/pugixml.cpp8
-rw-r--r--tests/test_dom_traverse.cpp32
2 files changed, 40 insertions, 0 deletions
diff --git a/src/pugixml.cpp b/src/pugixml.cpp
index 694a1a6..9bb054e 100644
--- a/src/pugixml.cpp
+++ b/src/pugixml.cpp
@@ -4350,6 +4350,10 @@ PUGI__NS_BEGIN
{
s += 2;
+ // since overflow detection relies on length of the sequence skip leading zeros
+ while (*s == '0')
+ s++;
+
const char_t* start = s;
for (;;)
@@ -4370,6 +4374,10 @@ PUGI__NS_BEGIN
}
else
{
+ // since overflow detection relies on length of the sequence skip leading zeros
+ while (*s == '0')
+ s++;
+
const char_t* start = s;
for (;;)
diff --git a/tests/test_dom_traverse.cpp b/tests/test_dom_traverse.cpp
index c7408cb..6cebd50 100644
--- a/tests/test_dom_traverse.cpp
+++ b/tests/test_dom_traverse.cpp
@@ -1188,6 +1188,22 @@ TEST_XML(dom_as_uint_hex_overflow, "<node attr1='-0x1' attr2='0x100000000' attr3
CHECK(node.attribute(STR("attr3")).as_uint() == 4294967295);
}
+TEST_XML(dom_as_int_many_digits, "<node attr1='0000000000000000000000000000000000000000000000001' />")
+{
+ xml_node node = doc.child(STR("node"));
+
+ CHECK(node.attribute(STR("attr1")).as_int() == 1);
+ CHECK(node.attribute(STR("attr1")).as_uint() == 1);
+}
+
+TEST_XML(dom_as_int_hex_many_digits, "<node attr1='0x0000000000000000000000000000000000000000000000001' />")
+{
+ xml_node node = doc.child(STR("node"));
+
+ CHECK(node.attribute(STR("attr1")).as_int() == 1);
+ CHECK(node.attribute(STR("attr1")).as_uint() == 1);
+}
+
#ifdef PUGIXML_HAS_LONG_LONG
TEST_XML(dom_as_llong_overflow, "<node attr1='-9223372036854775809' attr2='9223372036854775808' attr3='-18446744073709551616' />")
{
@@ -1224,6 +1240,22 @@ TEST_XML(dom_as_ullong_hex_overflow, "<node attr1='-0x1' attr2='0x10000000000000
CHECK(node.attribute(STR("attr2")).as_ullong() == 18446744073709551615ull);
CHECK(node.attribute(STR("attr3")).as_ullong() == 18446744073709551615ull);
}
+
+TEST_XML(dom_as_llong_many_digits, "<node attr1='0000000000000000000000000000000000000000000000001' />")
+{
+ xml_node node = doc.child(STR("node"));
+
+ CHECK(node.attribute(STR("attr1")).as_llong() == 1);
+ CHECK(node.attribute(STR("attr1")).as_ullong() == 1);
+}
+
+TEST_XML(dom_as_llong_hex_many_digits, "<node attr1='0x0000000000000000000000000000000000000000000000001' />")
+{
+ xml_node node = doc.child(STR("node"));
+
+ CHECK(node.attribute(STR("attr1")).as_llong() == 1);
+ CHECK(node.attribute(STR("attr1")).as_ullong() == 1);
+}
#endif
TEST_XML(dom_as_int_plus, "<node attr1='+1' attr2='+0xa' />")