Merged revisions 73677,73681 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r73677 | hirokazu.yamamoto | 2009-06-29 22:25:16 +0900 | 2 lines

  Issue #6344: Fixed a crash of mmap.read() when passed a negative argument.
  Reviewed by Amaury Forgeot d'Arc.
........
  r73681 | hirokazu.yamamoto | 2009-06-29 23:29:31 +0900 | 1 line

  Fixed NEWS.
........
This commit is contained in:
Hirokazu Yamamoto 2009-06-29 14:37:28 +00:00
parent 9c661a4916
commit b7b811c383
2 changed files with 15 additions and 3 deletions

View file

@ -56,6 +56,8 @@ Core and Builtins
Library Library
------- -------
- Issue #6344: Fixed a crash of mmap.read() when passed a negative argument.
- Issue #5230: pydoc would report no documentation found if a module generated - Issue #5230: pydoc would report no documentation found if a module generated
a 'not found' import error when loaded; it now reports the import errors. a 'not found' import error when loaded; it now reports the import errors.
Thanks to Lucas Prado Melo for initial fix and collaboration on the tests. Thanks to Lucas Prado Melo for initial fix and collaboration on the tests.

View file

@ -232,7 +232,7 @@ static PyObject *
mmap_read_method(mmap_object *self, mmap_read_method(mmap_object *self,
PyObject *args) PyObject *args)
{ {
Py_ssize_t num_bytes; Py_ssize_t num_bytes, n;
PyObject *result; PyObject *result;
CHECK_VALID(NULL); CHECK_VALID(NULL);
@ -240,8 +240,18 @@ mmap_read_method(mmap_object *self,
return(NULL); return(NULL);
/* silently 'adjust' out-of-range requests */ /* silently 'adjust' out-of-range requests */
if (num_bytes > self->size - self->pos) { assert(self->size >= self->pos);
num_bytes -= (self->pos+num_bytes) - self->size; n = self->size - self->pos;
/* The difference can overflow, only if self->size is greater than
* PY_SSIZE_T_MAX. But then the operation cannot possibly succeed,
* because the mapped area and the returned string each need more
* than half of the addressable memory. So we clip the size, and let
* the code below raise MemoryError.
*/
if (n < 0)
n = PY_SSIZE_T_MAX;
if (num_bytes < 0 || num_bytes > n) {
num_bytes = n;
} }
result = Py_BuildValue("s#", self->data+self->pos, num_bytes); result = Py_BuildValue("s#", self->data+self->pos, num_bytes);
self->pos += num_bytes; self->pos += num_bytes;