Issue 3551: Raise ValueError if the size causes ERROR_NO_SYSTEM_RESOURCES

This commit is contained in:
Jesse Noller 2009-04-02 04:22:09 +00:00
parent 238cedcd63
commit 5053fbbb38
4 changed files with 21 additions and 4 deletions

View file

@ -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
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])

View file

@ -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.

View file

@ -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) {
if (PyErr_Occurred())
return NULL;
else
return mp_SetError(PyExc_IOError, res); return mp_SetError(PyExc_IOError, res);
}
Py_RETURN_NONE; Py_RETURN_NONE;
} }

View file

@ -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;
} }