Commit ef517676 authored by Serhiy Storchaka's avatar Serhiy Storchaka

Issue #29444: Fixed out-of-bounds buffer access in the group() method of

the match object.  Based on patch by WGH.
parents 26581785 86e42376
...@@ -1821,6 +1821,16 @@ SUBPATTERN None 0 0 ...@@ -1821,6 +1821,16 @@ SUBPATTERN None 0 0
warnings.simplefilter('error', BytesWarning) warnings.simplefilter('error', BytesWarning)
self.assertNotEqual(pattern3, pattern1) self.assertNotEqual(pattern3, pattern1)
def test_bug_29444(self):
s = bytearray(b'abcdefgh')
m = re.search(b'[a-h]+', s)
m2 = re.search(b'[e-h]+', s)
self.assertEqual(m.group(), b'abcdefgh')
self.assertEqual(m2.group(), b'efgh')
s[:] = b'xyz'
self.assertEqual(m.group(), b'xyz')
self.assertEqual(m2.group(), b'')
class PatternReprTests(unittest.TestCase): class PatternReprTests(unittest.TestCase):
def check(self, pattern, expected): def check(self, pattern, expected):
......
...@@ -223,6 +223,9 @@ Extension Modules ...@@ -223,6 +223,9 @@ Extension Modules
Library Library
------- -------
- Issue #29444: Fixed out-of-bounds buffer access in the group() method of
the match object. Based on patch by WGH.
- Issue #29377: Add SlotWrapperType, MethodWrapperType, and - Issue #29377: Add SlotWrapperType, MethodWrapperType, and
MethodDescriptorType built-in types to types module. MethodDescriptorType built-in types to types module.
Original patch by Manuel Krebber. Original patch by Manuel Krebber.
......
...@@ -1945,6 +1945,7 @@ match_getslice_by_index(MatchObject* self, Py_ssize_t index, PyObject* def) ...@@ -1945,6 +1945,7 @@ match_getslice_by_index(MatchObject* self, Py_ssize_t index, PyObject* def)
Py_buffer view; Py_buffer view;
PyObject *result; PyObject *result;
void* ptr; void* ptr;
Py_ssize_t i, j;
if (index < 0 || index >= self->groups) { if (index < 0 || index >= self->groups) {
/* raise IndexError if we were given a bad group number */ /* raise IndexError if we were given a bad group number */
...@@ -1966,8 +1967,12 @@ match_getslice_by_index(MatchObject* self, Py_ssize_t index, PyObject* def) ...@@ -1966,8 +1967,12 @@ match_getslice_by_index(MatchObject* self, Py_ssize_t index, PyObject* def)
ptr = getstring(self->string, &length, &isbytes, &charsize, &view); ptr = getstring(self->string, &length, &isbytes, &charsize, &view);
if (ptr == NULL) if (ptr == NULL)
return NULL; return NULL;
result = getslice(isbytes, ptr,
self->string, self->mark[index], self->mark[index+1]); i = self->mark[index];
j = self->mark[index+1];
i = Py_MIN(i, length);
j = Py_MIN(j, length);
result = getslice(isbytes, ptr, self->string, i, j);
if (isbytes && view.buf != NULL) if (isbytes && view.buf != NULL)
PyBuffer_Release(&view); PyBuffer_Release(&view);
return result; return result;
......
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