Commit 2f89aa67 authored by Antoine Pitrou's avatar Antoine Pitrou

#2538: bytes objects can only provide read-only buffers

parent 07431a30
...@@ -453,6 +453,11 @@ class BaseBytesTest(unittest.TestCase): ...@@ -453,6 +453,11 @@ class BaseBytesTest(unittest.TestCase):
class BytesTest(BaseBytesTest): class BytesTest(BaseBytesTest):
type2test = bytes type2test = bytes
def test_buffer_is_readonly(self):
with open(sys.stdin.fileno(), "rb", buffering=0) as f:
self.assertRaises(TypeError, f.readinto, b"")
class ByteArrayTest(BaseBytesTest): class ByteArrayTest(BaseBytesTest):
type2test = bytearray type2test = bytearray
......
...@@ -1112,7 +1112,7 @@ class BufferIOTest(SocketConnectedTest): ...@@ -1112,7 +1112,7 @@ class BufferIOTest(SocketConnectedTest):
SocketConnectedTest.__init__(self, methodName=methodName) SocketConnectedTest.__init__(self, methodName=methodName)
def testRecvInto(self): def testRecvInto(self):
buf = b" "*1024 buf = bytearray(1024)
nbytes = self.cli_conn.recv_into(buf) nbytes = self.cli_conn.recv_into(buf)
self.assertEqual(nbytes, len(MSG)) self.assertEqual(nbytes, len(MSG))
msg = buf[:len(MSG)] msg = buf[:len(MSG)]
...@@ -1123,7 +1123,7 @@ class BufferIOTest(SocketConnectedTest): ...@@ -1123,7 +1123,7 @@ class BufferIOTest(SocketConnectedTest):
self.serv_conn.send(buf) self.serv_conn.send(buf)
def testRecvFromInto(self): def testRecvFromInto(self):
buf = b" "*1024 buf = bytearray(1024)
nbytes, addr = self.cli_conn.recvfrom_into(buf) nbytes, addr = self.cli_conn.recvfrom_into(buf)
self.assertEqual(nbytes, len(MSG)) self.assertEqual(nbytes, len(MSG))
msg = buf[:len(MSG)] msg = buf[:len(MSG)]
......
...@@ -965,7 +965,7 @@ static int ...@@ -965,7 +965,7 @@ static int
string_buffer_getbuffer(PyBytesObject *self, Py_buffer *view, int flags) string_buffer_getbuffer(PyBytesObject *self, Py_buffer *view, int flags)
{ {
return PyBuffer_FillInfo(view, (void *)self->ob_sval, Py_SIZE(self), return PyBuffer_FillInfo(view, (void *)self->ob_sval, Py_SIZE(self),
0, flags); 1, flags);
} }
static PySequenceMethods string_as_sequence = { static PySequenceMethods string_as_sequence = {
......
...@@ -56,7 +56,7 @@ PyMemoryView_FromObject(PyObject *base) ...@@ -56,7 +56,7 @@ PyMemoryView_FromObject(PyObject *base)
if (mview == NULL) return NULL; if (mview == NULL) return NULL;
mview->base = NULL; mview->base = NULL;
if (PyObject_GetBuffer(base, &(mview->view), PyBUF_FULL) < 0) { if (PyObject_GetBuffer(base, &(mview->view), PyBUF_FULL_RO) < 0) {
Py_DECREF(mview); Py_DECREF(mview);
return NULL; return NULL;
} }
...@@ -204,9 +204,9 @@ _indirect_copy_nd(char *dest, Py_buffer *view, char fort) ...@@ -204,9 +204,9 @@ _indirect_copy_nd(char *dest, Py_buffer *view, char fort)
a contiguous buffer if it is not. The view will point to a contiguous buffer if it is not. The view will point to
the shadow buffer which can be written to and then the shadow buffer which can be written to and then
will be copied back into the other buffer when the memory will be copied back into the other buffer when the memory
view is de-allocated. While the shadow buffer is view is de-allocated. While the shadow buffer is
being used, it will have an exclusive write lock on being used, it will have an exclusive write lock on
the original buffer. the original buffer.
*/ */
PyObject * PyObject *
...@@ -528,7 +528,7 @@ memory_subscript(PyMemoryViewObject *self, PyObject *key) ...@@ -528,7 +528,7 @@ memory_subscript(PyMemoryViewObject *self, PyObject *key)
/* Return a new memory-view object */ /* Return a new memory-view object */
Py_buffer newview; Py_buffer newview;
memset(&newview, 0, sizeof(newview)); memset(&newview, 0, sizeof(newview));
/* XXX: This needs to be fixed so it /* XXX: This needs to be fixed so it
actually returns a sub-view actually returns a sub-view
*/ */
return PyMemoryView_FromMemory(&newview); return PyMemoryView_FromMemory(&newview);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment