diff options
author | Victor Stinner <victor.stinner@haypocalc.com> | 2011-09-28 21:54:59 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@haypocalc.com> | 2011-09-28 21:54:59 (GMT) |
commit | f5ca1a21a52882954de256909d13a8977d70a881 (patch) | |
tree | e9d5f996daebc1bd52d044c0c49a2eff5927187b | |
parent | 7c8c1ea3ecc9e83c6916d7548fb92ff5d018b2db (diff) | |
download | cpython-f5ca1a21a52882954de256909d13a8977d70a881.zip cpython-f5ca1a21a52882954de256909d13a8977d70a881.tar.gz cpython-f5ca1a21a52882954de256909d13a8977d70a881.tar.bz2 |
PyUnicode_CopyCharacters() fails if 'to' has more than 1 reference
-rw-r--r-- | Include/unicodeobject.h | 3 | ||||
-rw-r--r-- | Objects/unicodeobject.c | 8 |
2 files changed, 10 insertions, 1 deletions
diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h index 0b93276..99f54c3 100644 --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -522,7 +522,8 @@ PyAPI_FUNC(int) _PyUnicode_Ready( character conversion when necessary and falls back to memcpy if possible. Fail if 'to' is smaller than how_many or smaller than len(from)-from_start, - or if kind(from[from_start:from_start+how_many]) > kind(to). + or if kind(from[from_start:from_start+how_many]) > kind(to), or if to has + more than 1 reference. Return the number of written character, or return -1 and raise an exception on error. diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index ae2dbf5..af05f4c 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -631,6 +631,14 @@ PyUnicode_CopyCharacters(PyObject *to, Py_ssize_t to_start, how_many, to_start, PyUnicode_GET_LENGTH(to)); return -1; } + if (how_many == 0) + return 0; + + if (Py_REFCNT(to) != 1) { + PyErr_SetString(PyExc_ValueError, + "Cannot modify a string having more than 1 reference"); + return -1; + } from_kind = PyUnicode_KIND(from); to_kind = PyUnicode_KIND(to); |