diff options
author | Guido van Rossum <guido@python.org> | 2000-05-09 14:14:27 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2000-05-09 14:14:27 (GMT) |
commit | b8872e61c622e15c68336fcc776e705f904e1e50 (patch) | |
tree | 215fff0dff7ca3de6a76769f193b3564cdbd5539 /Objects | |
parent | 2a91cd463ae63ab1e716159d3dac2b8ee923c4c7 (diff) | |
download | cpython-b8872e61c622e15c68336fcc776e705f904e1e50.zip cpython-b8872e61c622e15c68336fcc776e705f904e1e50.tar.gz cpython-b8872e61c622e15c68336fcc776e705f904e1e50.tar.bz2 |
Trent Mick:
Fix the string methods that implement slice-like semantics with
optional args (count, find, endswith, etc.) to properly handle
indeces outside [INT_MIN, INT_MAX]. Previously the "i" formatter
for PyArg_ParseTuple was used to get the indices. These could overflow.
This patch changes the string methods to use the "O&" formatter with
the slice_index() function from ceval.c which is used to do the same
job for Python code slices (e.g. 'abcabcabc'[0:1000000000L]).
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/unicodeobject.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 14866ab..e00a9b8 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -3023,7 +3023,8 @@ unicode_count(PyUnicodeObject *self, PyObject *args) int end = INT_MAX; PyObject *result; - if (!PyArg_ParseTuple(args, "O|ii:count", &substring, &start, &end)) + if (!PyArg_ParseTuple(args, "O|O&O&:count", &substring, + _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end)) return NULL; substring = (PyUnicodeObject *)PyUnicode_FromObject( @@ -3150,7 +3151,8 @@ unicode_find(PyUnicodeObject *self, PyObject *args) int end = INT_MAX; PyObject *result; - if (!PyArg_ParseTuple(args, "O|ii:find", &substring, &start, &end)) + if (!PyArg_ParseTuple(args, "O|O&O&:find", &substring, + _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end)) return NULL; substring = (PyUnicodeObject *)PyUnicode_FromObject( (PyObject *)substring); @@ -3212,7 +3214,8 @@ unicode_index(PyUnicodeObject *self, PyObject *args) int start = 0; int end = INT_MAX; - if (!PyArg_ParseTuple(args, "O|ii:index", &substring, &start, &end)) + if (!PyArg_ParseTuple(args, "O|O&O&:index", &substring, + _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end)) return NULL; substring = (PyUnicodeObject *)PyUnicode_FromObject( @@ -3642,7 +3645,8 @@ unicode_rfind(PyUnicodeObject *self, PyObject *args) int end = INT_MAX; PyObject *result; - if (!PyArg_ParseTuple(args, "O|ii:rfind", &substring, &start, &end)) + if (!PyArg_ParseTuple(args, "O|O&O&:rfind", &substring, + _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end)) return NULL; substring = (PyUnicodeObject *)PyUnicode_FromObject( (PyObject *)substring); @@ -3668,7 +3672,8 @@ unicode_rindex(PyUnicodeObject *self, PyObject *args) int start = 0; int end = INT_MAX; - if (!PyArg_ParseTuple(args, "O|ii:rindex", &substring, &start, &end)) + if (!PyArg_ParseTuple(args, "O|O&O&:rindex", &substring, + _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end)) return NULL; substring = (PyUnicodeObject *)PyUnicode_FromObject( (PyObject *)substring); @@ -3937,7 +3942,8 @@ unicode_startswith(PyUnicodeObject *self, int end = INT_MAX; PyObject *result; - if (!PyArg_ParseTuple(args, "O|ii:startswith", &substring, &start, &end)) + if (!PyArg_ParseTuple(args, "O|O&O&:startswith", &substring, + _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end)) return NULL; substring = (PyUnicodeObject *)PyUnicode_FromObject( (PyObject *)substring); @@ -3967,7 +3973,8 @@ unicode_endswith(PyUnicodeObject *self, int end = INT_MAX; PyObject *result; - if (!PyArg_ParseTuple(args, "O|ii:endswith", &substring, &start, &end)) + if (!PyArg_ParseTuple(args, "O|O&O&:endswith", &substring, + _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end)) return NULL; substring = (PyUnicodeObject *)PyUnicode_FromObject( (PyObject *)substring); |