Commit 6c939cb6 authored by Benjamin Peterson's avatar Benjamin Peterson

in scan_once, prevent the reading of arbitrary memory when passed a negative index

Bug reported by Guido Vranken.
parent 4624b00d
...@@ -60,5 +60,10 @@ class TestDecode(object): ...@@ -60,5 +60,10 @@ class TestDecode(object):
msg = 'escape' msg = 'escape'
self.assertRaisesRegexp(ValueError, msg, self.loads, s) self.assertRaisesRegexp(ValueError, msg, self.loads, s)
def test_negative_index(self):
d = self.json.JSONDecoder()
self.assertRaises(ValueError, d.raw_decode, 'a'*42, -50000)
self.assertRaises(ValueError, d.raw_decode, u'a'*42, -50000)
class TestPyDecode(TestDecode, PyTest): pass class TestPyDecode(TestDecode, PyTest): pass
class TestCDecode(TestDecode, CTest): pass class TestCDecode(TestDecode, CTest): pass
...@@ -1369,6 +1369,7 @@ Pauli Virtanen ...@@ -1369,6 +1369,7 @@ Pauli Virtanen
Frank Visser Frank Visser
Johannes Vogel Johannes Vogel
Alex Volkov Alex Volkov
Guido Vranken
Martijn Vries Martijn Vries
Sjoerd de Vries Sjoerd de Vries
Niki W. Waibel Niki W. Waibel
......
...@@ -43,6 +43,9 @@ Core and Builtins ...@@ -43,6 +43,9 @@ Core and Builtins
Library Library
------- -------
- Fix arbitrary memory access in JSONDecoder.raw_decode with a negative second
parameter. Bug reported by Guido Vranken.
- Issue #21172: isinstance check relaxed from dict to collections.Mapping. - Issue #21172: isinstance check relaxed from dict to collections.Mapping.
- Issue #21191: In os.fdopen, alwyas close the file descriptor when an exception - Issue #21191: In os.fdopen, alwyas close the file descriptor when an exception
......
...@@ -1468,7 +1468,10 @@ scan_once_str(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *n ...@@ -1468,7 +1468,10 @@ scan_once_str(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *n
PyObject *res; PyObject *res;
char *str = PyString_AS_STRING(pystr); char *str = PyString_AS_STRING(pystr);
Py_ssize_t length = PyString_GET_SIZE(pystr); Py_ssize_t length = PyString_GET_SIZE(pystr);
if (idx >= length) { if (idx < 0)
/* Compatibility with the Python version. */
idx += length;
if (idx < 0 || idx >= length) {
PyErr_SetNone(PyExc_StopIteration); PyErr_SetNone(PyExc_StopIteration);
return NULL; return NULL;
} }
...@@ -1555,7 +1558,10 @@ scan_once_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_ ...@@ -1555,7 +1558,10 @@ scan_once_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_
PyObject *res; PyObject *res;
Py_UNICODE *str = PyUnicode_AS_UNICODE(pystr); Py_UNICODE *str = PyUnicode_AS_UNICODE(pystr);
Py_ssize_t length = PyUnicode_GET_SIZE(pystr); Py_ssize_t length = PyUnicode_GET_SIZE(pystr);
if (idx >= length) { if (idx < 0)
/* Compatibility with Python version. */
idx += length;
if (idx < 0 || idx >= length) {
PyErr_SetNone(PyExc_StopIteration); PyErr_SetNone(PyExc_StopIteration);
return NULL; return NULL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment