Skip to content

Commit d7bb2fb

Browse files
committed
gh-153803: Raise ResponseError for a malformed struct in xmlrpc.client
1 parent b090d06 commit d7bb2fb

3 files changed

Lines changed: 12 additions & 0 deletions

File tree

Lib/test/test_xmlrpc.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,13 @@ def test_loads_unsupported(self):
252252
'</struct></value></param></params>')
253253
self.assertRaises(ResponseError, xmlrpclib.loads, data)
254254

255+
def test_loads_malformed_struct(self):
256+
ResponseError = xmlrpclib.ResponseError
257+
data = ('<params><param><value><struct>'
258+
'<member><name>k</name></member>'
259+
'</struct></value></param></params>')
260+
self.assertRaises(ResponseError, xmlrpclib.loads, data)
261+
255262
def check_loads(self, s, value, **kwargs):
256263
dump = '<params><param><value>%s</value></param></params>' % s
257264
result, m = xmlrpclib.loads(dump, **kwargs)

Lib/xmlrpc/client.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -756,6 +756,8 @@ def end_struct(self, data):
756756
# map structs to Python dictionaries
757757
dict = {}
758758
items = self._stack[mark:]
759+
if len(items) % 2:
760+
raise ResponseError()
759761
for i in range(0, len(items), 2):
760762
dict[items[i]] = items[i+1]
761763
self._stack[mark:] = [dict]
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Fix :func:`xmlrpc.client.loads` raising :exc:`IndexError` instead of
2+
:exc:`~xmlrpc.client.ResponseError` for a malformed ``<struct>``. Patch by
3+
tonghuaroot.

0 commit comments

Comments
 (0)