]> granicus.if.org Git - python/commitdiff
Issue #12323: Strengthen error checking of the position XPath selectors
authorEli Bendersky <eliben@gmail.com>
Thu, 24 Jan 2013 14:29:26 +0000 (06:29 -0800)
committerEli Bendersky <eliben@gmail.com>
Thu, 24 Jan 2013 14:29:26 +0000 (06:29 -0800)
Lib/test/test_xml_etree.py
Lib/xml/etree/ElementPath.py

index 00db44cdb735bdee07dbaa61098f5b39e99eb9bb..def1b61810d6cf49bc26eb1effccba0e07ec949c 100644 (file)
@@ -1793,6 +1793,11 @@ class ElementFindTest(unittest.TestCase):
         self.assertEqual(e.find('./tag[last()-1]').attrib['class'], 'c')
         self.assertEqual(e.find('./tag[last()-2]').attrib['class'], 'b')
 
+        self.assertRaisesRegex(SyntaxError, 'XPath', e.find, './tag[0]')
+        self.assertRaisesRegex(SyntaxError, 'XPath', e.find, './tag[-1]')
+        self.assertRaisesRegex(SyntaxError, 'XPath', e.find, './tag[last()-0]')
+        self.assertRaisesRegex(SyntaxError, 'XPath', e.find, './tag[last()+1]')
+
     def test_findall(self):
         e = ET.XML(SAMPLE_XML)
         e[2] = ET.XML(SAMPLE_SECTION)
index 341dac0204b8e4428a537b1d784881a902e771a5..bf984b9b9de07eeab4b62e1592efc42e3c6b5746 100644 (file)
@@ -174,7 +174,7 @@ def prepare_predicate(next, token):
                 if elem.get(key) == value:
                     yield elem
         return select
-    if signature == "-" and not re.match("\d+$", predicate[0]):
+    if signature == "-" and not re.match("\-?\d+$", predicate[0]):
         # [tag]
         tag = predicate[0]
         def select(context, result):
@@ -182,7 +182,7 @@ def prepare_predicate(next, token):
                 if elem.find(tag) is not None:
                     yield elem
         return select
-    if signature == "-='" and not re.match("\d+$", predicate[0]):
+    if signature == "-='" and not re.match("\-?\d+$", predicate[0]):
         # [tag='value']
         tag = predicate[0]
         value = predicate[-1]
@@ -196,7 +196,10 @@ def prepare_predicate(next, token):
     if signature == "-" or signature == "-()" or signature == "-()-":
         # [index] or [last()] or [last()-index]
         if signature == "-":
+            # [index]
             index = int(predicate[0]) - 1
+            if index < 0:
+                raise SyntaxError("XPath position >= 1 expected")
         else:
             if predicate[0] != "last":
                 raise SyntaxError("unsupported function")
@@ -205,6 +208,8 @@ def prepare_predicate(next, token):
                     index = int(predicate[2]) - 1
                 except ValueError:
                     raise SyntaxError("unsupported expression")
+                if index > -2:
+                    raise SyntaxError("XPath offset from last() must be negative")
             else:
                 index = -1
         def select(context, result):