diff Objects/stringobject.c @ 38302:9c08a7bdbc31 legacy-trunk

Fixed problem identified by Georg. The special-case in-place code for replace made a copy of the string using PyString_FromStringAndSize(s, n) and modify the copied string in-place. However, 1 (and 0) character strings are shared from a cache. This cause "A".replace("A", "a") to change the cached version of "A" -- used by everyone. Now may the copy with NULL as the string and do the memcpy manually. I've added regression tests to check if this happens in the future. Perhaps there should be a PyString_Copy for this case?
author Andrew Dalke <dalke@dalkescientific.com>
date Thu, 25 May 2006 17:53:00 +0000
parents 41809406a35e
children 17eaa8b57e05
line wrap: on
line diff
--- a/Objects/stringobject.c	Thu May 25 17:34:03 2006 +0000
+++ b/Objects/stringobject.c	Thu May 25 17:53:00 2006 +0000
@@ -2692,10 +2692,11 @@
 	}
 	
 	/* Need to make a new string */
-	result = (PyStringObject *) PyString_FromStringAndSize(self_s, self_len);
+	result = (PyStringObject *) PyString_FromStringAndSize(NULL, self_len);
 	if (result == NULL)
 		return NULL;
 	result_s = PyString_AS_STRING(result);
+	memcpy(result_s, self_s, self_len);
 	
 	/* change everything in-place, starting with this one */
 	start =  result_s + (next-self_s);
@@ -2745,10 +2746,12 @@
 	}
 	
 	/* Need to make a new string */
-	result = (PyStringObject *) PyString_FromStringAndSize(self_s, self_len);
+	result = (PyStringObject *) PyString_FromStringAndSize(NULL, self_len);
 	if (result == NULL)
 		return NULL;
 	result_s = PyString_AS_STRING(result);
+	memcpy(result_s, self_s, self_len);
+
 	
 	/* change everything in-place, starting with this one */
 	start =  result_s + offset;