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
670d78ab
Commit
670d78ab
authored
Nov 25, 2015
by
Serhiy Storchaka
Browse files
Options
Browse Files
Download
Plain Diff
Issue #24097: Fixed crash in object.__reduce__() if slot name is freed inside
__getattr__. Original patch by Antoine Pitrou.
parents
2cefc1ef
d28bb624
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
23 additions
and
0 deletions
+23
-0
Lib/test/test_descr.py
Lib/test/test_descr.py
+17
-0
Misc/NEWS
Misc/NEWS
+3
-0
Objects/typeobject.c
Objects/typeobject.c
+3
-0
No files found.
Lib/test/test_descr.py
View file @
670d78ab
...
...
@@ -5092,6 +5092,23 @@ class PicklingTests(unittest.TestCase):
objcopy2
=
deepcopy
(
objcopy
)
self
.
_assert_is_copy
(
obj
,
objcopy2
)
def
test_issue24097
(
self
):
# Slot name is freed inside __getattr__ and is later used.
class
S
(
str
):
# Not interned
pass
class
A
:
__slotnames__
=
[
S
(
'spam'
)]
def
__getattr__
(
self
,
attr
):
if
attr
==
'spam'
:
A
.
__slotnames__
[:]
=
[
S
(
'spam'
)]
return
42
else
:
raise
AttributeError
import
copyreg
expected
=
(
copyreg
.
__newobj__
,
(
A
,),
(
None
,
{
'spam'
:
42
}),
None
,
None
)
self
.
assertEqual
(
A
().
__reduce__
(
2
),
expected
)
# Shouldn't crash
class
SharedKeyTests
(
unittest
.
TestCase
):
...
...
Misc/NEWS
View file @
670d78ab
...
...
@@ -10,6 +10,9 @@ Release date: XXXX-XX-XX
Core and Builtins
-----------------
- Issue #24097: Fixed crash in object.__reduce__() if slot name is freed inside
__getattr__.
- Issue #24731: Fixed crash on converting objects with special methods
__bytes__, __trunc__, and __float__ returning instances of subclasses of
bytes, int, and float to subclasses of bytes, int, and float correspondingly.
...
...
Objects/typeobject.c
View file @
670d78ab
...
...
@@ -3889,8 +3889,10 @@ _PyObject_GetState(PyObject *obj)
PyObject
*
name
,
*
value
;
name
=
PyList_GET_ITEM
(
slotnames
,
i
);
Py_INCREF
(
name
);
value
=
PyObject_GetAttr
(
obj
,
name
);
if
(
value
==
NULL
)
{
Py_DECREF
(
name
);
if
(
!
PyErr_ExceptionMatches
(
PyExc_AttributeError
))
{
goto
error
;
}
...
...
@@ -3899,6 +3901,7 @@ _PyObject_GetState(PyObject *obj)
}
else
{
int
err
=
PyDict_SetItem
(
slots
,
name
,
value
);
Py_DECREF
(
name
);
Py_DECREF
(
value
);
if
(
err
)
{
goto
error
;
...
...
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