Skip to content

Commit e8563e6

Browse files
committed
Disallow non-string keys in __setattr__
1 parent 6a2611b commit e8563e6

File tree

2 files changed

+5
-1
lines changed
  • graalpython

2 files changed

+5
-1
lines changed

graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_class.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@
44
*graalpython.lib-python.3.test.test_class.ClassTests.testInit
55
*graalpython.lib-python.3.test.test_class.ClassTests.testMisc
66
*graalpython.lib-python.3.test.test_class.ClassTests.testSFBug532646
7+
*graalpython.lib-python.3.test.test_class.ClassTests.testSetattrNonStringName
78
*graalpython.lib-python.3.test.test_class.ClassTests.testSetattrWrapperNameIntern
89
*graalpython.lib-python.3.test.test_class.ClassTests.testUnaryOps

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/object/ObjectBuiltins.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
6666
import com.oracle.graal.python.builtins.objects.function.PKeyword;
6767
import com.oracle.graal.python.builtins.objects.object.ObjectBuiltinsFactory.GetAttributeNodeFactory;
68+
import com.oracle.graal.python.builtins.objects.str.StringNodes;
6869
import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass;
6970
import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass;
7071
import com.oracle.graal.python.builtins.objects.type.TypeNodes;
@@ -430,13 +431,15 @@ public static GetAttributeNode create() {
430431
@GenerateNodeFactory
431432
public abstract static class SetattrNode extends PythonTernaryBuiltinNode {
432433
@Specialization(limit = "3")
433-
protected PNone doIt(VirtualFrame frame, Object object, Object key, Object value,
434+
protected PNone doIt(VirtualFrame frame, Object object, Object keyObject, Object value,
434435
@CachedLibrary("object") PythonObjectLibrary libObj,
436+
@Cached StringNodes.CastToJavaStringCheckedNode castToString,
435437
@Cached("create()") LookupAttributeInMRONode.Dynamic getExisting,
436438
@Cached("create()") GetClassNode getDataClassNode,
437439
@Cached("create(__SET__)") LookupAttributeInMRONode lookupSetNode,
438440
@Cached("create()") CallTernaryMethodNode callSetNode,
439441
@Cached("create()") WriteAttributeToObjectNode writeNode) {
442+
String key = castToString.cast(keyObject, "attribute name must be string, not '%p'", keyObject);
440443
Object type = libObj.getLazyPythonClass(object);
441444
Object descr = getExisting.execute(type, key);
442445
if (descr != PNone.NO_VALUE) {

0 commit comments

Comments
 (0)