]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Backport 2.166 from trunk:
authorGuido van Rossum <guido@python.org>
Mon, 23 Sep 2002 20:46:52 +0000 (20:46 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 23 Sep 2002 20:46:52 +0000 (20:46 +0000)
Fix SF bug 599128, submitted by Inyeol Lee: .replace() would do the
wrong thing for a unicode subclass when there were zero string
replacements.  The example given in the SF bug report was only one way
to trigger this; replacing a string of length >= 2 that's not found is
another.  The code would actually write outside allocated memory if
replacement string was longer than the search string.

Objects/unicodeobject.c

index d4e247196dfb512f0faaa022500b1f96813e3c8e..b1ba48dd37356a12984c1e029cb1d00ba2653288 100644 (file)
@@ -3509,10 +3509,16 @@ PyObject *replace(PyUnicodeObject *self,
         n = count(self, 0, self->length, str1);
         if (n > maxcount)
             n = maxcount;
-        if (n == 0 && PyUnicode_CheckExact(self)) {
+        if (n == 0) {
             /* nothing to replace, return original string */
-            Py_INCREF(self);
-            u = self;
+            if (PyUnicode_CheckExact(self)) {
+                Py_INCREF(self);
+                u = self;
+            }
+            else {
+                u = (PyUnicodeObject *)
+                    PyUnicode_FromUnicode(self->str, self->length);
+           }
         } else {
             u = _PyUnicode_New(
                 self->length + n * (str2->length - str1->length));