]> granicus.if.org Git - python/commitdiff
Issue #26873: xmlrpclib now raises ResponseError on unsupported type tags
authorSerhiy Storchaka <storchaka@gmail.com>
Wed, 4 May 2016 08:28:09 +0000 (11:28 +0300)
committerSerhiy Storchaka <storchaka@gmail.com>
Wed, 4 May 2016 08:28:09 +0000 (11:28 +0300)
instead of silently return incorrect result.

Lib/test/test_xmlrpc.py
Lib/xmlrpclib.py
Misc/NEWS

index ca8d5d8cc03e1afc3d88eb60fe84bca3c33e1488..97d9e8f789cd31ab792050b6eba79771d5f480a0 100644 (file)
@@ -208,6 +208,20 @@ class XMLRPCTestCase(unittest.TestCase):
             self.assertEqual(s, "abc \xc2\x95")
             self.assertEqual(items, [("def \xc2\x96", "ghi \xc2\x97")])
 
+    def test_loads_unsupported(self):
+        ResponseError = xmlrpclib.ResponseError
+        data = '<params><param><value><spam/></value></param></params>'
+        self.assertRaises(ResponseError, xmlrpclib.loads, data)
+        data = ('<params><param><value><array>'
+                '<value><spam/></value>'
+                '</array></value></param></params>')
+        self.assertRaises(ResponseError, xmlrpclib.loads, data)
+        data = ('<params><param><value><struct>'
+                '<member><name>a</name><value><spam/></value></member>'
+                '<member><name>b</name><value><spam/></value></member>'
+                '</struct></value></param></params>')
+        self.assertRaises(ResponseError, xmlrpclib.loads, data)
+
 
 class HelperTestCase(unittest.TestCase):
     def test_escape(self):
index 3a2c0bf38f19a7e6eb39bc43fade1f7a789fb2aa..e072f71a3acac086eef2be4b65800826be2c7db2 100644 (file)
@@ -784,6 +784,7 @@ class Unmarshaller:
         self._stack = []
         self._marks = []
         self._data = []
+        self._value = False
         self._methodname = None
         self._encoding = "utf-8"
         self.append = self._stack.append
@@ -814,6 +815,8 @@ class Unmarshaller:
         if tag == "array" or tag == "struct":
             self._marks.append(len(self._stack))
         self._data = []
+        if self._value and tag not in self.dispatch:
+            raise ResponseError("unknown tag %r" % tag)
         self._value = (tag == "value")
 
     def data(self, text):
index e521ae1488f641e7b962832dfd804c8573bf1273..88f7486203c4e7714e10d539808ed9e8b740871c 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -77,6 +77,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #26873: xmlrpclib now raises ResponseError on unsupported type tags
+  instead of silently return incorrect result.
+
 - Issue #24114: Fix an uninitialized variable in `ctypes.util`.
 
   The bug only occurs on SunOS when the ctypes implementation searches