Kaydet (Commit) 5053fbbb authored tarafından Jesse Noller's avatar Jesse Noller

Issue 3551: Raise ValueError if the size causes ERROR_NO_SYSTEM_RESOURCES

üst 238cedcd
...@@ -710,7 +710,8 @@ Connection objects usually created using :func:`Pipe` -- see also ...@@ -710,7 +710,8 @@ Connection objects usually created using :func:`Pipe` -- see also
Send an object to the other end of the connection which should be read Send an object to the other end of the connection which should be read
using :meth:`recv`. using :meth:`recv`.
The object must be picklable. The object must be picklable. Very large pickles (approximately 32 MB+,
though it depends on the OS) may raise a ValueError exception.
.. method:: recv() .. method:: recv()
...@@ -742,7 +743,9 @@ Connection objects usually created using :func:`Pipe` -- see also ...@@ -742,7 +743,9 @@ Connection objects usually created using :func:`Pipe` -- see also
complete message. complete message.
If *offset* is given then data is read from that position in *buffer*. If If *offset* is given then data is read from that position in *buffer*. If
*size* is given then that many bytes will be read from buffer. *size* is given then that many bytes will be read from buffer. Very large
buffers (approximately 32 MB+, though it depends on the OS) may raise a
ValueError exception
.. method:: recv_bytes([maxlength]) .. method:: recv_bytes([maxlength])
......
...@@ -202,6 +202,10 @@ Core and Builtins ...@@ -202,6 +202,10 @@ Core and Builtins
Library Library
------- -------
- Issue 3551: Patch multiprocessing to raise a proper exception if the size of the
object when writefile is called causes a ERROR_NO_SYSTEM_RESOURCES. Added docs
to note the limitation
- unittest.assertNotEqual() now uses the inequality operator (!=) instead - unittest.assertNotEqual() now uses the inequality operator (!=) instead
of the equality operator. of the equality operator.
......
...@@ -131,8 +131,12 @@ connection_sendbytes(ConnectionObject *self, PyObject *args) ...@@ -131,8 +131,12 @@ connection_sendbytes(ConnectionObject *self, PyObject *args)
res = conn_send_string(self, buffer + offset, size); res = conn_send_string(self, buffer + offset, size);
if (res < 0) if (res < 0) {
return mp_SetError(PyExc_IOError, res); if (PyErr_Occurred())
return NULL;
else
return mp_SetError(PyExc_IOError, res);
}
Py_RETURN_NONE; Py_RETURN_NONE;
} }
......
...@@ -23,6 +23,12 @@ conn_send_string(ConnectionObject *conn, char *string, size_t length) ...@@ -23,6 +23,12 @@ conn_send_string(ConnectionObject *conn, char *string, size_t length)
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
ret = WriteFile(conn->handle, string, length, &amount_written, NULL); ret = WriteFile(conn->handle, string, length, &amount_written, NULL);
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
if (ret == 0 && GetLastError() == ERROR_NO_SYSTEM_RESOURCES) {
PyErr_Format(PyExc_ValueError, "Cannnot send %" PY_FORMAT_SIZE_T "d bytes over connection", length);
return MP_STANDARD_ERROR;
}
return ret ? MP_SUCCESS : MP_STANDARD_ERROR; return ret ? MP_SUCCESS : MP_STANDARD_ERROR;
} }
......
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