summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArseny Kapoulkine <arseny.kapoulkine@gmail.com>2015-10-17 10:33:50 -0700
committerArseny Kapoulkine <arseny.kapoulkine@gmail.com>2015-10-17 10:33:50 -0700
commit0e09571f21d41969a26e9ec73ef0da78d9371d38 (patch)
treef4e921109fc05c4595f92e835a3c3ab3488a0868
parente8e54ea5de080d33780c68847057adf82c12ec16 (diff)
Fix integer overflow detection with leading zeros
Since they don't contribute to the resulting value just skip them before parsing. This matches the behavior of strtol/strtoll and results in more intuitive behavior.
-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' />")