mirror of https://github.com/python/cpython
Issue #1174606: Calling read() without arguments of an unbounded file
(typically /dev/zero under Unix) could crash the interpreter. No test as there always seems to be a risk of putting the machine on its knees.
This commit is contained in:
parent
24f3629083
commit
66994e1154
|
@ -43,6 +43,9 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #1174606: Calling read() without arguments of an unbounded file
|
||||||
|
(typically /dev/zero under Unix) could crash the interpreter.
|
||||||
|
|
||||||
- The max_buffer_size arguments of io.BufferedWriter, io.BufferedRWPair, and
|
- The max_buffer_size arguments of io.BufferedWriter, io.BufferedRWPair, and
|
||||||
io.BufferedRandom have been deprecated for removal in Python 3.2.
|
io.BufferedRandom have been deprecated for removal in Python 3.2.
|
||||||
|
|
||||||
|
|
|
@ -502,9 +502,14 @@ new_buffersize(PyFileIOObject *self, size_t currentsize)
|
||||||
if (fstat(self->fd, &st) == 0) {
|
if (fstat(self->fd, &st) == 0) {
|
||||||
end = st.st_size;
|
end = st.st_size;
|
||||||
pos = lseek(self->fd, 0L, SEEK_CUR);
|
pos = lseek(self->fd, 0L, SEEK_CUR);
|
||||||
if (end >= pos && pos >= 0)
|
/* Files claiming a size smaller than SMALLCHUNK may
|
||||||
|
actually be streaming pseudo-files. In this case, we
|
||||||
|
apply the more aggressive algorithm below.
|
||||||
|
*/
|
||||||
|
if (end >= SMALLCHUNK && pos >= 0) {
|
||||||
|
/* Add 1 so if the file were to grow we'd notice. */
|
||||||
return currentsize + end - pos + 1;
|
return currentsize + end - pos + 1;
|
||||||
/* Add 1 so if the file were to grow we'd notice. */
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (currentsize > SMALLCHUNK) {
|
if (currentsize > SMALLCHUNK) {
|
||||||
|
@ -533,7 +538,13 @@ fileio_readall(PyFileIOObject *self)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
Py_ssize_t newsize = new_buffersize(self, total);
|
size_t newsize = new_buffersize(self, total);
|
||||||
|
if (newsize > PY_SSIZE_T_MAX || newsize <= 0) {
|
||||||
|
PyErr_SetString(PyExc_OverflowError,
|
||||||
|
"unbounded read returned more bytes "
|
||||||
|
"than a Python string can hold ");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (PyBytes_GET_SIZE(result) < newsize) {
|
if (PyBytes_GET_SIZE(result) < newsize) {
|
||||||
if (_PyBytes_Resize(&result, newsize) < 0) {
|
if (_PyBytes_Resize(&result, newsize) < 0) {
|
||||||
|
|
Loading…
Reference in New Issue