Skip to content

Commit 79ee79f

Browse files
committed
Check code point validity
1 parent e659cd1 commit 79ee79f

File tree

4 files changed

+17
-10
lines changed

4 files changed

+17
-10
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,7 @@
437437
*graalpython.lib-python.3.test.test_array.UnicodeTest.test_index
438438
*graalpython.lib-python.3.test.test_array.UnicodeTest.test_initialize_with_unicode
439439
*graalpython.lib-python.3.test.test_array.UnicodeTest.test_insert
440+
*graalpython.lib-python.3.test.test_array.UnicodeTest.test_issue17223
440441
*graalpython.lib-python.3.test.test_array.UnicodeTest.test_iterator_pickle
441442
*graalpython.lib-python.3.test.test_array.UnicodeTest.test_len
442443
*graalpython.lib-python.3.test.test_array.UnicodeTest.test_mul

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/array/ArrayBuiltins.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -554,14 +554,14 @@ static Object delitem(PArray self, PSlice slice,
554554
int step = sliceInfo.step;
555555
int sliceLength = sliceInfo.sliceLength;
556556
int itemsize = self.getFormat().bytesize;
557-
if (simpleStepProfile.profile(step == 1)) {
558-
self.delSlice(start, sliceLength);
559-
} else {
560-
if (step < 0) {
561-
start += 1 + step * (sliceLength - 1) - 1;
562-
step = -step;
563-
}
564-
if (sliceLength > 0) {
557+
if (sliceLength > 0) {
558+
if (simpleStepProfile.profile(step == 1)) {
559+
self.delSlice(start, sliceLength);
560+
} else {
561+
if (step < 0) {
562+
start += 1 + step * (sliceLength - 1) - 1;
563+
step = -step;
564+
}
565565
int cur, offset;
566566
for (cur = start, offset = 0; offset < sliceLength - 1; cur += step, offset++) {
567567
PythonUtils.arraycopy(self.getBuffer(), (cur + 1) * itemsize, self.getBuffer(), (cur - offset) * itemsize, (step - 1) * itemsize);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/array/PArray.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ public void shift(int from, int by) throws OverflowException {
119119
}
120120

121121
public void delSlice(int at, int count) {
122-
assert count > 0;
122+
assert count >= 0;
123123
assert at + count <= lenght;
124124
int newLength = lenght - count;
125125
assert newLength >= 0;

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/BufferStorageNodes.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,15 @@
4242

4343
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.OverflowError;
4444
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
45+
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError;
4546

4647
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
4748
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
4849
import com.oracle.graal.python.builtins.objects.ints.PInt;
4950
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
5051
import com.oracle.graal.python.builtins.objects.str.PString;
5152
import com.oracle.graal.python.builtins.objects.str.StringNodes;
53+
import com.oracle.graal.python.nodes.ErrorMessages;
5254
import com.oracle.graal.python.nodes.PGuards;
5355
import com.oracle.graal.python.nodes.PRaiseNode;
5456
import com.oracle.graal.python.nodes.util.CastToJavaUnsignedLongNode;
@@ -142,8 +144,12 @@ static Object unpackChar(@SuppressWarnings("unused") BufferFormat format, byte[]
142144
}
143145

144146
@Specialization(guards = "format == UNICODE")
145-
static Object unpackUnicode(@SuppressWarnings("unused") BufferFormat format, byte[] bytes, int offset) {
147+
static Object unpackUnicode(@SuppressWarnings("unused") BufferFormat format, byte[] bytes, int offset,
148+
@Cached PRaiseNode raiseNode) {
146149
int codePoint = PythonUtils.arrayAccessor.getInt(bytes, offset);
150+
if (!Character.isValidCodePoint(codePoint)) {
151+
throw raiseNode.raise(ValueError, ErrorMessages.UNMAPPABLE_CHARACTER);
152+
}
147153
return codePointToString(codePoint);
148154
}
149155

0 commit comments

Comments
 (0)