mirror of
https://github.com/python/cpython.git
synced 2025-08-31 14:07:50 +00:00
Added checks to prevent PyUnicode_Count() from dumping core
in case the parameters are out of bounds and fixes error handling for .count(), .startswith() and .endswith() for the case of mixed string/Unicode objects. This patch adds Python style index semantics to PyUnicode_Count() indices (including the special handling of negative indices). The patch is an extended version of patch #103249 submitted by Michael Hudson (mwh) on SF. It also includes new test cases.
This commit is contained in:
parent
1c5aa6901f
commit
3a645e4dd4
4 changed files with 56 additions and 19 deletions
|
@ -1236,9 +1236,14 @@ string_count(PyStringObject *self, PyObject *args)
|
|||
sub = PyString_AS_STRING(subobj);
|
||||
n = PyString_GET_SIZE(subobj);
|
||||
}
|
||||
else if (PyUnicode_Check(subobj))
|
||||
return PyInt_FromLong(
|
||||
PyUnicode_Count((PyObject *)self, subobj, i, last));
|
||||
else if (PyUnicode_Check(subobj)) {
|
||||
int count;
|
||||
count = PyUnicode_Count((PyObject *)self, subobj, i, last);
|
||||
if (count == -1)
|
||||
return NULL;
|
||||
else
|
||||
return PyInt_FromLong((long) count);
|
||||
}
|
||||
else if (PyObject_AsCharBuffer(subobj, &sub, &n))
|
||||
return NULL;
|
||||
|
||||
|
@ -1637,10 +1642,15 @@ string_startswith(PyStringObject *self, PyObject *args)
|
|||
prefix = PyString_AS_STRING(subobj);
|
||||
plen = PyString_GET_SIZE(subobj);
|
||||
}
|
||||
else if (PyUnicode_Check(subobj))
|
||||
return PyInt_FromLong(
|
||||
PyUnicode_Tailmatch((PyObject *)self,
|
||||
subobj, start, end, -1));
|
||||
else if (PyUnicode_Check(subobj)) {
|
||||
int rc;
|
||||
rc = PyUnicode_Tailmatch((PyObject *)self,
|
||||
subobj, start, end, -1);
|
||||
if (rc == -1)
|
||||
return NULL;
|
||||
else
|
||||
return PyInt_FromLong((long) rc);
|
||||
}
|
||||
else if (PyObject_AsCharBuffer(subobj, &prefix, &plen))
|
||||
return NULL;
|
||||
|
||||
|
@ -1690,10 +1700,15 @@ string_endswith(PyStringObject *self, PyObject *args)
|
|||
suffix = PyString_AS_STRING(subobj);
|
||||
slen = PyString_GET_SIZE(subobj);
|
||||
}
|
||||
else if (PyUnicode_Check(subobj))
|
||||
return PyInt_FromLong(
|
||||
PyUnicode_Tailmatch((PyObject *)self,
|
||||
subobj, start, end, +1));
|
||||
else if (PyUnicode_Check(subobj)) {
|
||||
int rc;
|
||||
rc = PyUnicode_Tailmatch((PyObject *)self,
|
||||
subobj, start, end, +1);
|
||||
if (rc == -1)
|
||||
return NULL;
|
||||
else
|
||||
return PyInt_FromLong((long) rc);
|
||||
}
|
||||
else if (PyObject_AsCharBuffer(subobj, &suffix, &slen))
|
||||
return NULL;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue