Commit 7b0ea78c 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 a5f43f6e
...@@ -70,5 +70,9 @@ class TestDecode: ...@@ -70,5 +70,9 @@ class TestDecode:
msg = 'escape' msg = 'escape'
self.assertRaisesRegex(ValueError, msg, self.loads, s) self.assertRaisesRegex(ValueError, msg, self.loads, s)
def test_negative_index(self):
d = self.json.JSONDecoder()
self.assertRaises(ValueError, d.raw_decode, 'a'*42, -50000)
class TestPyDecode(TestDecode, PyTest): pass class TestPyDecode(TestDecode, PyTest): pass
class TestCDecode(TestDecode, CTest): pass class TestCDecode(TestDecode, CTest): pass
...@@ -1139,6 +1139,7 @@ Frank Visser ...@@ -1139,6 +1139,7 @@ Frank Visser
Johannes Vogel Johannes Vogel
Martijn Vries Martijn Vries
Sjoerd de Vries Sjoerd de Vries
Guido Vranken
Niki W. Waibel Niki W. Waibel
Wojtek Walczak Wojtek Walczak
Charles Waldman Charles Waldman
......
...@@ -10,6 +10,9 @@ What's New in Python 3.2.6? ...@@ -10,6 +10,9 @@ What's New in Python 3.2.6?
Library Library
------- -------
- Fix arbitrary memory access in JSONDecoder.raw_decode with a negative second
parameter. Bug reported by Guido Vranken.
- Issue #21082: In os.makedirs, do not set the process-wide umask. Note this - Issue #21082: In os.makedirs, do not set the process-wide umask. Note this
changes behavior of makedirs when exist_ok=True. changes behavior of makedirs when exist_ok=True.
......
...@@ -930,7 +930,10 @@ scan_once_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_ ...@@ -930,7 +930,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