Fix SF bug 546434 -- buffer slice type inconsistent.
diff --git a/Misc/NEWS b/Misc/NEWS
index 99c3547..9fb542d 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -6,6 +6,11 @@
 
 Core and builtins
 
+- Slices and repetitions of buffer objects now consistently return
+  a string.  Formerly, strings would be returned most of the time,
+  but a buffer object would be returned when the repetition count
+  was one or when the slice range was all inclusive.
+
 - The __slots__ variable can now mention "private" names, and the
   right thing will happen (e.g. __slots__ = ["__foo"]).
 
diff --git a/Objects/bufferobject.c b/Objects/bufferobject.c
index 031c000..690f56b 100644
--- a/Objects/bufferobject.c
+++ b/Objects/bufferobject.c
@@ -296,13 +296,6 @@
 	if ( (count = (*pb->bf_getreadbuffer)(other, 0, &p2)) < 0 )
 		return NULL;
 
-	/* optimize special case */
-	if ( count == 0 )
-	{
-	    Py_INCREF(self);
-	    return (PyObject *)self;
-	}
-
 	ob = PyString_FromStringAndSize(NULL, self->b_size + count);
 	p1 = PyString_AS_STRING(ob);
 	memcpy(p1, self->b_ptr, self->b_size);
@@ -361,12 +354,6 @@
 		right = 0;
 	if ( right > self->b_size )
 		right = self->b_size;
-	if ( left == 0 && right == self->b_size )
-	{
-		/* same as self */
-		Py_INCREF(self);
-		return (PyObject *)self;
-	}
 	if ( right < left )
 		right = left;
 	return PyString_FromStringAndSize((char *)self->b_ptr + left,