Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
f188bc5d
Commit
f188bc5d
authored
May 11, 2011
by
Ezio Melotti
Browse files
Options
Browse Files
Download
Plain Diff
#12051: merge with 3.1.
parents
ccc87b53
13672653
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
38 additions
and
3 deletions
+38
-3
Lib/test/json_tests/test_recursion.py
Lib/test/json_tests/test_recursion.py
+20
-1
Misc/NEWS
Misc/NEWS
+3
-0
Modules/_json.c
Modules/_json.c
+15
-2
No files found.
Lib/test/json_tests/test_recursion.py
View file @
f188bc5d
...
...
@@ -16,6 +16,11 @@ class RecursiveJSONEncoder(json.JSONEncoder):
return
'JSONTestObject'
return
json
.
JSONEncoder
.
default
(
o
)
class
EndlessJSONEncoder
(
json
.
JSONEncoder
):
def
default
(
self
,
o
):
"""If check_circular is False, this will keep adding another list."""
return
[
o
]
class
TestRecursion
(
TestCase
):
def
test_listrecursion
(
self
):
...
...
@@ -67,7 +72,7 @@ class TestRecursion(TestCase):
self
.
fail
(
"didn't raise ValueError on default recursion"
)
def
test_highly_nested_objects
(
self
):
def
test_highly_nested_objects
_decoding
(
self
):
# test that loading highly-nested objects doesn't segfault when C
# accelerations are used. See #12017
with
self
.
assertRaises
(
RuntimeError
):
...
...
@@ -77,3 +82,17 @@ class TestRecursion(TestCase):
with
self
.
assertRaises
(
RuntimeError
):
json
.
loads
(
'['
*
100000
+
'1'
+
']'
*
100000
)
def
test_highly_nested_objects_encoding
(
self
):
# See #12051
l
,
d
=
[],
{}
for
x
in
range
(
100000
):
l
,
d
=
[
l
],
{
'k'
:
d
}
with
self
.
assertRaises
(
RuntimeError
):
json
.
dumps
(
l
)
with
self
.
assertRaises
(
RuntimeError
):
json
.
dumps
(
d
)
def
test_endless_recursion
(
self
):
# See #12051
with
self
.
assertRaises
(
RuntimeError
):
EndlessJSONEncoder
(
check_circular
=
False
).
encode
(
5j
)
Misc/NEWS
View file @
f188bc5d
...
...
@@ -342,6 +342,9 @@ Tools/Demos
Extension
Modules
-----------------
-
Issue
#
12051
:
Fix
segfault
in
json
.
dumps
()
while
encoding
highly
-
nested
objects
using
the
C
accelerations
.
-
Issue
#
12017
:
Fix
segfault
in
json
.
loads
()
while
decoding
highly
-
nested
objects
using
the
C
accelerations
.
...
...
Modules/_json.c
View file @
f188bc5d
...
...
@@ -1338,10 +1338,18 @@ encoder_listencode_obj(PyEncoderObject *s, PyObject *rval, PyObject *obj, Py_ssi
return
_steal_list_append
(
rval
,
encoded
);
}
else
if
(
PyList_Check
(
obj
)
||
PyTuple_Check
(
obj
))
{
return
encoder_listencode_list
(
s
,
rval
,
obj
,
indent_level
);
if
(
Py_EnterRecursiveCall
(
" while encoding a JSON object"
))
return
-
1
;
rv
=
encoder_listencode_list
(
s
,
rval
,
obj
,
indent_level
);
Py_LeaveRecursiveCall
();
return
rv
;
}
else
if
(
PyDict_Check
(
obj
))
{
return
encoder_listencode_dict
(
s
,
rval
,
obj
,
indent_level
);
if
(
Py_EnterRecursiveCall
(
" while encoding a JSON object"
))
return
-
1
;
rv
=
encoder_listencode_dict
(
s
,
rval
,
obj
,
indent_level
);
Py_LeaveRecursiveCall
();
return
rv
;
}
else
{
PyObject
*
ident
=
NULL
;
...
...
@@ -1367,7 +1375,12 @@ encoder_listencode_obj(PyEncoderObject *s, PyObject *rval, PyObject *obj, Py_ssi
Py_XDECREF
(
ident
);
return
-
1
;
}
if
(
Py_EnterRecursiveCall
(
" while encoding a JSON object"
))
return
-
1
;
rv
=
encoder_listencode_obj
(
s
,
rval
,
newobj
,
indent_level
);
Py_LeaveRecursiveCall
();
Py_DECREF
(
newobj
);
if
(
rv
)
{
Py_XDECREF
(
ident
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment