summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@haypocalc.com>2011-10-01 22:34:53 (GMT)
committerVictor Stinner <victor.stinner@haypocalc.com>2011-10-01 22:34:53 (GMT)
commitcd9950fd094394927c0cf85560679ca6a7b33038 (patch)
tree5678a6da8d21beed514da006c3ef12ac4bbf734c
parent2fe5ced752d5d17eae3e0ad23c0f7f2208770d2d (diff)
downloadcpython-cd9950fd094394927c0cf85560679ca6a7b33038.zip
cpython-cd9950fd094394927c0cf85560679ca6a7b33038.tar.gz
cpython-cd9950fd094394927c0cf85560679ca6a7b33038.tar.bz2
PyUnicode_WriteChar() raises IndexError on invalid index
PyUnicode_WriteChar() raises also a ValueError if the string has more than 1 reference.
-rw-r--r--Include/unicodeobject.h4
-rw-r--r--Objects/unicodeobject.c28
2 files changed, 24 insertions, 8 deletions
diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h
index bba1c23..d0d44e1 100644
--- a/Include/unicodeobject.h
+++ b/Include/unicodeobject.h
@@ -647,7 +647,9 @@ PyAPI_FUNC(Py_UCS4) PyUnicode_ReadChar(
);
/* Write a character to the string. The string must have been created through
- PyUnicode_New, must not be shared, and must not have been hashed yet. */
+ PyUnicode_New, must not be shared, and must not have been hashed yet.
+
+ Return 0 on success, -1 on error. */
PyAPI_FUNC(int) PyUnicode_WriteChar(
PyObject *unicode,
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index 0d06fcb..3ce845c 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -622,6 +622,19 @@ unicode_convert_wchar_to_ucs4(const wchar_t *begin, const wchar_t *end,
}
#endif
+static int
+_PyUnicode_Dirty(PyObject *unicode)
+{
+ assert(PyUnicode_Check(unicode));
+ if (Py_REFCNT(unicode) != 1) {
+ PyErr_SetString(PyExc_ValueError,
+ "Cannot modify a string having more than 1 reference");
+ return -1;
+ }
+ _PyUnicode_DIRTY(unicode);
+ return 0;
+}
+
Py_ssize_t
PyUnicode_CopyCharacters(PyObject *to, Py_ssize_t to_start,
PyObject *from, Py_ssize_t from_start,
@@ -651,12 +664,8 @@ PyUnicode_CopyCharacters(PyObject *to, Py_ssize_t to_start,
if (how_many == 0)
return 0;
- if (Py_REFCNT(to) != 1) {
- PyErr_SetString(PyExc_ValueError,
- "Cannot modify a string having more than 1 reference");
+ if (_PyUnicode_Dirty(to))
return -1;
- }
- _PyUnicode_DIRTY(to);
from_kind = PyUnicode_KIND(from);
from_data = PyUnicode_DATA(from);
@@ -2855,10 +2864,15 @@ int
PyUnicode_WriteChar(PyObject *unicode, Py_ssize_t index, Py_UCS4 ch)
{
if (!PyUnicode_Check(unicode) || !PyUnicode_IS_COMPACT(unicode)) {
- return PyErr_BadArgument();
+ PyErr_BadArgument();
return -1;
}
-
+ if (index < 0 || index >= _PyUnicode_LENGTH(unicode)) {
+ PyErr_SetString(PyExc_IndexError, "string index out of range");
+ return -1;
+ }
+ if (_PyUnicode_Dirty(unicode))
+ return -1;
PyUnicode_WRITE(PyUnicode_KIND(unicode), PyUnicode_DATA(unicode),
index, ch);
return 0;