diff Objects/stringobject.c @ 12615:67233df13037 legacy-trunk

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]). slice_index() is renamed _PyEval_SliceIndex() and is now exported. As well, the return values for success/fail were changed to make slice_index directly usable as required by the "O&" formatter. [GvR: shouldn't a similar patch be applied to unicodeobject.c?]
author Guido van Rossum <guido@python.org>
date Mon, 08 May 2000 14:08:05 +0000
parents 54274beb244d
children 4272b368bf69
line wrap: on
line diff
--- a/Objects/stringobject.c	Mon May 08 14:06:50 2000 +0000
+++ b/Objects/stringobject.c	Mon May 08 14:08:05 2000 +0000
@@ -822,8 +822,8 @@
 	int n, i = 0, last = INT_MAX;
 	PyObject *subobj;
 
-	if (!PyArg_ParseTuple(args, "O|ii:find/rfind/index/rindex", 
-			      &subobj, &i, &last))
+	if (!PyArg_ParseTuple(args, "O|O&O&:find/rfind/index/rindex", 
+		&subobj, _PyEval_SliceIndex, &i, _PyEval_SliceIndex, &last))
 		return -2;
 	if (PyString_Check(subobj)) {
 		sub = PyString_AS_STRING(subobj);
@@ -1194,8 +1194,10 @@
 	int m, r;
 	PyObject *subobj;
 
-	if (!PyArg_ParseTuple(args, "O|ii:count", &subobj, &i, &last))
+	if (!PyArg_ParseTuple(args, "O|O&O&:count", &subobj,
+		_PyEval_SliceIndex, &i, _PyEval_SliceIndex, &last))
 		return NULL;
+
 	if (PyString_Check(subobj)) {
 		sub = PyString_AS_STRING(subobj);
 		n = PyString_GET_SIZE(subobj);
@@ -1617,7 +1619,8 @@
 	int end = -1;
 	PyObject *subobj;
 
-	if (!PyArg_ParseTuple(args, "O|ii:startswith", &subobj, &start, &end))
+	if (!PyArg_ParseTuple(args, "O|O&O&:startswith", &subobj,
+		_PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end))
 		return NULL;
 	if (PyString_Check(subobj)) {
 		prefix = PyString_AS_STRING(subobj);
@@ -1671,7 +1674,8 @@
 	int lower, upper;
 	PyObject *subobj;
 
-	if (!PyArg_ParseTuple(args, "O|ii:endswith", &subobj, &start, &end))
+	if (!PyArg_ParseTuple(args, "O|O&O&:endswith", &subobj,
+		_PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end))
 		return NULL;
 	if (PyString_Check(subobj)) {
 		suffix = PyString_AS_STRING(subobj);