Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 0654ccd

Browse files
author
Hirokazu Yamamoto
committed
Merged revisions 69714,69718 via svnmerge from
svn+ssh://[email protected]/python/trunk ........ r69714 | hirokazu.yamamoto | 2009-02-17 19:12:10 +0900 | 1 line Issue #5292: Fixed mmap crash on its boundary access m[len(m)]. ........ r69718 | hirokazu.yamamoto | 2009-02-17 22:17:26 +0900 | 3 lines Issue #5282: Fixed mmap resize on 32bit windows and unix. When offset > 0, The file was resized to wrong size. ........
1 parent 14d34a0 commit 0654ccd

3 files changed

Lines changed: 34 additions & 4 deletions

File tree

Lib/test/test_mmap.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ def test_basic(self):
4242
self.assertEqual(m[0], 0)
4343
self.assertEqual(m[0:3], b'\0\0\0')
4444

45+
# Shouldn't crash on boundary (Issue #5292)
46+
self.assertRaises(IndexError, m.__getitem__, len(m))
47+
self.assertRaises(IndexError, m.__setitem__, len(m), b'\0')
48+
4549
# Modify the file's content
4650
m[0] = b'3'[0]
4751
m[PAGESIZE +3: PAGESIZE +3+3] = b'bar'
@@ -412,6 +416,27 @@ def test_offset (self):
412416
m = mmap.mmap(f.fileno(), mapsize - halfsize, offset=halfsize)
413417
self.assertEqual(m[0:3], b'foo')
414418
f.close()
419+
420+
# Try resizing map
421+
try:
422+
m.resize(512)
423+
except SystemError:
424+
pass
425+
else:
426+
# resize() is supported
427+
self.assertEqual(len(m), 512)
428+
# Check that we can no longer seek beyond the new size.
429+
self.assertRaises(ValueError, m.seek, 513, 0)
430+
# Check that the content is not changed
431+
self.assertEqual(m[0:3], b'foo')
432+
433+
# Check that the underlying file is truncated too
434+
f = open(TESTFN)
435+
f.seek(0, 2)
436+
self.assertEqual(f.tell(), halfsize + 512)
437+
f.close()
438+
self.assertEqual(m.size(), halfsize + 512)
439+
415440
m.close()
416441

417442
finally:

Misc/NEWS

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,11 @@ Core and Builtins
169169
Library
170170
-------
171171

172+
- Issue #5282: Fixed mmap resize on 32bit windows and unix. When offset > 0,
173+
The file was resized to wrong size.
174+
175+
- Issue #5292: Fixed mmap crash on its boundary access m[len(m)].
176+
172177
- Issue #2279: distutils.sdist.add_defaults now add files
173178
from the package_data and the data_files metadata.
174179

Modules/mmapmodule.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,7 @@ mmap_resize_method(mmap_object *self,
455455
off_lo = (DWORD)(self->offset & 0xFFFFFFFF);
456456
#else
457457
newSizeHigh = 0;
458-
newSizeLow = (DWORD)new_size;
458+
newSizeLow = (DWORD)(self->offset + new_size);
459459
off_hi = 0;
460460
off_lo = (DWORD)self->offset;
461461
#endif
@@ -501,7 +501,7 @@ mmap_resize_method(mmap_object *self,
501501
} else {
502502
void *newmap;
503503

504-
if (ftruncate(self->fd, new_size) == -1) {
504+
if (ftruncate(self->fd, self->offset + new_size) == -1) {
505505
PyErr_SetFromErrno(mmap_module_error);
506506
return NULL;
507507
}
@@ -692,7 +692,7 @@ mmap_subscript(mmap_object *self, PyObject *item)
692692
return NULL;
693693
if (i < 0)
694694
i += self->size;
695-
if (i < 0 || (size_t)i > self->size) {
695+
if (i < 0 || (size_t)i >= self->size) {
696696
PyErr_SetString(PyExc_IndexError,
697697
"mmap index out of range");
698698
return NULL;
@@ -797,7 +797,7 @@ mmap_ass_subscript(mmap_object *self, PyObject *item, PyObject *value)
797797
return -1;
798798
if (i < 0)
799799
i += self->size;
800-
if (i < 0 || (size_t)i > self->size) {
800+
if (i < 0 || (size_t)i >= self->size) {
801801
PyErr_SetString(PyExc_IndexError,
802802
"mmap index out of range");
803803
return -1;

0 commit comments

Comments
 (0)