Skip to content

Commit eab3541

Browse files
committed
[GR-34614][GR-46727] Fix accessing uninitialized memory after extending native storage
PullRequest: graalpython/2848
2 parents 0d561b8 + 9b64ccd commit eab3541

File tree

10 files changed

+473
-121
lines changed

10 files changed

+473
-121
lines changed

graalpython/com.oracle.graal.python.cext/src/errors.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
#undef PyErr_BadInternalCall
4444
void PyErr_BadInternalCall(void) {
4545
assert(0 && "bad argument to internal function");
46-
Graal_PyTruffleErr_CreateAndSetException(PyExc_SystemError, truffleString("bad argument to internal function"));
46+
PyErr_SetString(PyExc_SystemError, "bad argument to internal function");
4747
}
4848
#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
4949

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextBuiltinRegistry.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@ private PythonCextBuiltinRegistry() {
7676
public static final CApiBuiltinExecutable PyCapsule_SetPointer = new CApiBuiltinExecutable("PyCapsule_SetPointer", CApiCallPath.Direct, ArgDescriptor.Int, new ArgDescriptor[]{ArgDescriptor.PyObject, ArgDescriptor.Pointer}, 15);
7777
public static final CApiBuiltinExecutable PyClassMethod_New = new CApiBuiltinExecutable("PyClassMethod_New", CApiCallPath.Direct, ArgDescriptor.PyObjectTransfer, new ArgDescriptor[]{ArgDescriptor.PyObject}, 16);
7878
public static final CApiBuiltinExecutable PyCode_Addr2Line = new CApiBuiltinExecutable("PyCode_Addr2Line", CApiCallPath.Direct, ArgDescriptor.Int, new ArgDescriptor[]{ArgDescriptor.PyCodeObject, ArgDescriptor.Int}, 17);
79-
public static final CApiBuiltinExecutable PyCode_GetFileName = new CApiBuiltinExecutable("PyCode_GetFileName", CApiCallPath.Direct, ArgDescriptor.PyObjectBorrowed, new ArgDescriptor[]{ArgDescriptor.PyCodeObject}, 18);
80-
public static final CApiBuiltinExecutable PyCode_GetName = new CApiBuiltinExecutable("PyCode_GetName", CApiCallPath.Direct, ArgDescriptor.PyObjectBorrowed, new ArgDescriptor[]{ArgDescriptor.PyCodeObject}, 19);
79+
public static final CApiBuiltinExecutable PyCode_GetFileName = new CApiBuiltinExecutable("PyCode_GetFileName", CApiCallPath.Direct, ArgDescriptor.PyObjectTransfer, new ArgDescriptor[]{ArgDescriptor.PyCodeObject}, 18);
80+
public static final CApiBuiltinExecutable PyCode_GetName = new CApiBuiltinExecutable("PyCode_GetName", CApiCallPath.Direct, ArgDescriptor.PyObjectTransfer, new ArgDescriptor[]{ArgDescriptor.PyCodeObject}, 19);
8181
public static final CApiBuiltinExecutable PyCode_New = new CApiBuiltinExecutable("PyCode_New", CApiCallPath.Direct, ArgDescriptor.PyCodeObjectTransfer, new ArgDescriptor[]{ArgDescriptor.Int, ArgDescriptor.Int, ArgDescriptor.Int, ArgDescriptor.Int, ArgDescriptor.Int, ArgDescriptor.PyObject, ArgDescriptor.PyObject, ArgDescriptor.PyObject, ArgDescriptor.PyObject, ArgDescriptor.PyObject, ArgDescriptor.PyObject, ArgDescriptor.PyObject, ArgDescriptor.PyObject, ArgDescriptor.Int, ArgDescriptor.PyObject}, 20);
8282
public static final CApiBuiltinExecutable PyCode_NewEmpty = new CApiBuiltinExecutable("PyCode_NewEmpty", CApiCallPath.Direct, ArgDescriptor.PyCodeObjectTransfer, new ArgDescriptor[]{ArgDescriptor.ConstCharPtrAsTruffleString, ArgDescriptor.ConstCharPtrAsTruffleString, ArgDescriptor.Int}, 21);
8383
public static final CApiBuiltinExecutable PyCode_NewWithPosOnlyArgs = new CApiBuiltinExecutable("PyCode_NewWithPosOnlyArgs", CApiCallPath.Direct, ArgDescriptor.PyCodeObjectTransfer, new ArgDescriptor[]{ArgDescriptor.Int, ArgDescriptor.Int, ArgDescriptor.Int, ArgDescriptor.Int, ArgDescriptor.Int, ArgDescriptor.Int, ArgDescriptor.PyObject, ArgDescriptor.PyObject, ArgDescriptor.PyObject, ArgDescriptor.PyObject, ArgDescriptor.PyObject, ArgDescriptor.PyObject, ArgDescriptor.PyObject, ArgDescriptor.PyObject, ArgDescriptor.Int, ArgDescriptor.PyObject}, 22);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextCodeBuiltins.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyCodeObject;
4747
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyCodeObjectTransfer;
4848
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObject;
49-
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectBorrowed;
49+
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectTransfer;
5050
import static com.oracle.graal.python.util.PythonUtils.EMPTY_BYTE_ARRAY;
5151
import static com.oracle.graal.python.util.PythonUtils.EMPTY_OBJECT_ARRAY;
5252
import static com.oracle.graal.python.util.PythonUtils.EMPTY_TRUFFLESTRING_ARRAY;
@@ -132,15 +132,15 @@ static int addr2line(PCode code, int bci) {
132132
}
133133
}
134134

135-
@CApiBuiltin(ret = PyObjectBorrowed, args = {PyCodeObject}, call = Direct)
135+
@CApiBuiltin(ret = PyObjectTransfer, args = {PyCodeObject}, call = Direct)
136136
abstract static class PyCode_GetName extends CApiUnaryBuiltinNode {
137137
@Specialization
138138
static Object get(PCode code) {
139139
return code.getName();
140140
}
141141
}
142142

143-
@CApiBuiltin(ret = PyObjectBorrowed, args = {PyCodeObject}, call = Direct)
143+
@CApiBuiltin(ret = PyObjectTransfer, args = {PyCodeObject}, call = Direct)
144144
abstract static class PyCode_GetFileName extends CApiUnaryBuiltinNode {
145145
@Specialization
146146
static Object get(PCode code) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextListBuiltins.java

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,12 @@
4444
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SystemError;
4545
import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Direct;
4646
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Int;
47-
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Void;
4847
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyListObject;
4948
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObject;
5049
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectBorrowed;
5150
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectTransfer;
5251
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Py_ssize_t;
52+
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Void;
5353
import static com.oracle.graal.python.nodes.ErrorMessages.BAD_ARG_TO_INTERNAL_FUNC_S;
5454

5555
import java.util.Arrays;
@@ -66,7 +66,6 @@
6666
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
6767
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.GetItemScalarNode;
6868
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.ListGeneralizationNode;
69-
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.SetItemNode;
7069
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.SetItemScalarNode;
7170
import com.oracle.graal.python.builtins.objects.list.ListBuiltins;
7271
import com.oracle.graal.python.builtins.objects.list.ListBuiltins.ListExtendNode;
@@ -296,11 +295,13 @@ int fallback(Object list, @SuppressWarnings("unused") Object i, @SuppressWarning
296295
abstract static class _PyList_SET_ITEM extends CApiTernaryBuiltinNode {
297296
@Specialization
298297
int doManaged(PList list, long index, Object element,
299-
@Cached("createSetItem()") SequenceStorageNodes.SetItemNode setItemNode,
298+
@Cached ListGeneralizationNode generalizationNode,
299+
@Cached SequenceStorageNodes.InitializeItemScalarNode setItemNode,
300300
@Cached ConditionProfile generalizedProfile) {
301301
SequenceStorage sequenceStorage = list.getSequenceStorage();
302302
checkBounds(sequenceStorage, index);
303-
SequenceStorage newStorage = setItemNode.execute(null, sequenceStorage, (int) index, element);
303+
SequenceStorage newStorage = generalizationNode.execute(sequenceStorage, element);
304+
setItemNode.execute(newStorage, (int) index, element);
304305
if (generalizedProfile.profile(list.getSequenceStorage() != newStorage)) {
305306
list.setSequenceStorage(newStorage);
306307
}
@@ -329,10 +330,6 @@ private void checkBounds(SequenceStorage sequenceStorage, long index) {
329330
throw raise(IndexError, ErrorMessages.INDEX_OUT_OF_BOUNDS);
330331
}
331332
}
332-
333-
protected static SetItemNode createSetItem() {
334-
return SetItemNode.create(null, ListGeneralizationNode::create);
335-
}
336333
}
337334

338335
@CApiBuiltin(ret = Int, args = {PyObject}, call = Direct)

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextTupleBuiltins.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,8 @@ protected static SetItemNode createSetItem() {
133133
abstract static class _PyTuple_SET_ITEM extends CApiTernaryBuiltinNode {
134134
@Specialization
135135
int doManaged(PTuple tuple, long index, Object element,
136-
@Cached("createSetItem()") SequenceStorageNodes.SetItemNode setItemNode,
136+
@Cached ListGeneralizationNode generalizationNode,
137+
@Cached SequenceStorageNodes.InitializeItemScalarNode setItemNode,
137138
@Cached ConditionProfile generalizedProfile) {
138139
// we cannot assume that there is nothing already in the tuple, because the API usage
139140
// is valid if the tuple has never been visible to Python code so far, and it is up to
@@ -142,7 +143,8 @@ int doManaged(PTuple tuple, long index, Object element,
142143
// times
143144
SequenceStorage sequenceStorage = tuple.getSequenceStorage();
144145
checkBounds(sequenceStorage, index);
145-
SequenceStorage newStorage = setItemNode.execute(null, sequenceStorage, (int) index, element);
146+
SequenceStorage newStorage = generalizationNode.execute(sequenceStorage, element);
147+
setItemNode.execute(newStorage, (int) index, element);
146148
if (generalizedProfile.profile(tuple.getSequenceStorage() != newStorage)) {
147149
tuple.setSequenceStorage(newStorage);
148150
}
@@ -171,10 +173,6 @@ private void checkBounds(SequenceStorage sequenceStorage, long index) {
171173
throw raise(IndexError, ErrorMessages.TUPLE_OUT_OF_BOUNDS);
172174
}
173175
}
174-
175-
protected static SetItemNode createSetItem() {
176-
return SetItemNode.create(null, ListGeneralizationNode::create);
177-
}
178176
}
179177

180178
@CApiBuiltin(ret = PyObjectBorrowed, args = {PyObject, Py_ssize_t}, call = Direct)

0 commit comments

Comments
 (0)