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.
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));