[Python-checkins] r70052 - in python/trunk: Lib/test/test_mmap.py Misc/NEWS Modules/mmapmodule.c

hirokazu.yamamoto python-checkins at python.org
Sat Feb 28 11:31:54 CET 2009


Author: hirokazu.yamamoto
Date: Sat Feb 28 11:31:54 2009
New Revision: 70052
Log:
Issue #5386: mmap.write_byte didn't check map size, so it could cause buffer
overrun.
Modified:
 python/trunk/Lib/test/test_mmap.py
 python/trunk/Misc/NEWS
 python/trunk/Modules/mmapmodule.c
Modified: python/trunk/Lib/test/test_mmap.py
==============================================================================
--- python/trunk/Lib/test/test_mmap.py	(original)
+++ python/trunk/Lib/test/test_mmap.py	Sat Feb 28 11:31:54 2009
@@ -467,6 +467,38 @@
 self.assert_(issubclass(mmap.error, EnvironmentError))
 self.assert_("mmap.error" in str(mmap.error))
 
+ def test_io_methods(self):
+ data = "0123456789"
+ open(TESTFN, "wb").write("x"*len(data))
+ f = open(TESTFN, "r+b")
+ m = mmap.mmap(f.fileno(), len(data))
+ f.close()
+ # Test write_byte()
+ for i in xrange(len(data)):
+ self.assertEquals(m.tell(), i)
+ m.write_byte(data[i:i+1])
+ self.assertEquals(m.tell(), i+1)
+ self.assertRaises(ValueError, m.write_byte, "x")
+ self.assertEquals(m[:], data)
+ # Test read_byte()
+ m.seek(0)
+ for i in xrange(len(data)):
+ self.assertEquals(m.tell(), i)
+ self.assertEquals(m.read_byte(), data[i:i+1])
+ self.assertEquals(m.tell(), i+1)
+ self.assertRaises(ValueError, m.read_byte)
+ # Test read()
+ m.seek(3)
+ self.assertEquals(m.read(3), "345")
+ self.assertEquals(m.tell(), 6)
+ # Test write()
+ m.seek(3)
+ m.write("bar")
+ self.assertEquals(m.tell(), 6)
+ self.assertEquals(m[:], "012bar6789")
+ m.seek(8)
+ self.assertRaises(ValueError, m.write, "bar")
+
 
 def test_main():
 run_unittest(MmapTests)
Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Sat Feb 28 11:31:54 2009
@@ -166,6 +166,9 @@
 Library
 -------
 
+- Issue #5386: mmap.write_byte didn't check map size, so it could cause buffer
+ overrun.
+
 - Issue #1533164: Installed but not listed *.pyo was breaking Distutils
 bdist_rpm command.
 
Modified: python/trunk/Modules/mmapmodule.c
==============================================================================
--- python/trunk/Modules/mmapmodule.c	(original)
+++ python/trunk/Modules/mmapmodule.c	Sat Feb 28 11:31:54 2009
@@ -365,10 +365,17 @@
 
 	if (!is_writeable(self))
 		return NULL;
-	*(self->data+self->pos) = value;
-	self->pos += 1;
-	Py_INCREF(Py_None);
-	return Py_None;
+
+	if (self->pos < self->size) {
+		*(self->data+self->pos) = value;
+		self->pos += 1;
+		Py_INCREF(Py_None);
+		return Py_None;
+	}
+	else {
+		PyErr_SetString(PyExc_ValueError, "write byte out of range");
+		return NULL;
+	}
 }
 
 static PyObject *


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /