summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Objects/stringobject.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index 748592e..acfce8b 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -933,6 +933,7 @@ static PyObject *
string_repeat(register PyStringObject *a, register int n)
{
register int i;
+ register int j;
register int size;
register PyStringObject *op;
size_t nbytes;
@@ -965,8 +966,16 @@ string_repeat(register PyStringObject *a, register int n)
PyObject_INIT_VAR(op, &PyString_Type, size);
op->ob_shash = -1;
op->ob_sstate = SSTATE_NOT_INTERNED;
- for (i = 0; i < size; i += a->ob_size)
- memcpy(op->ob_sval+i, a->ob_sval, (int) a->ob_size);
+ i = 0;
+ if (i < size) {
+ memcpy(op->ob_sval, a->ob_sval, (int) a->ob_size);
+ i = (int) a->ob_size;
+ }
+ while (i < size) {
+ j = (i <= size-i) ? i : size-i;
+ memcpy(op->ob_sval+i, op->ob_sval, j);
+ i += j;
+ }
op->ob_sval[size] = '\0';
return (PyObject *) op;
}