[Python-checkins] r87728 - in python/branches/py3k: Lib/test/test_xml_etree_c.py Misc/NEWS Python/getargs.c

victor.stinner python-checkins at python.org
Tue Jan 4 03:07:34 CET 2011


Author: victor.stinner
Date: Tue Jan  4 03:07:34 2011
New Revision: 87728

Log:
Issue #8651: PyArg_Parse*() functions raise an OverflowError if the file
doesn't have PY_SSIZE_T_CLEAN define and the size doesn't fit in an int
(length bigger than 2^31-1).

Modified:
   python/branches/py3k/Lib/test/test_xml_etree_c.py
   python/branches/py3k/Misc/NEWS
   python/branches/py3k/Python/getargs.c

Modified: python/branches/py3k/Lib/test/test_xml_etree_c.py
==============================================================================
--- python/branches/py3k/Lib/test/test_xml_etree_c.py	(original)
+++ python/branches/py3k/Lib/test/test_xml_etree_c.py	Tue Jan  4 03:07:34 2011
@@ -1,6 +1,8 @@
 # xml.etree test for cElementTree
 
 from test import support
+from test.support import precisionbigmemtest, _2G
+import unittest
 
 cET = support.import_module('xml.etree.cElementTree')
 
@@ -31,12 +33,28 @@
     """
 
 
+class MiscTests(unittest.TestCase):
+    # Issue #8651.
+    @support.precisionbigmemtest(size=support._2G + 100, memuse=1)
+    def test_length_overflow(self, size):
+        if size < support._2G + 100:
+            self.skipTest("not enough free memory, need at least 2 GB")
+        data = b'x' * size
+        parser = cET.XMLParser()
+        try:
+            self.assertRaises(OverflowError, parser.feed, data)
+        finally:
+            data = None
+
+
 def test_main():
     from test import test_xml_etree, test_xml_etree_c
 
     # Run the tests specific to the C implementation
     support.run_doctest(test_xml_etree_c, verbosity=True)
 
+    support.run_unittest(MiscTests)
+
     # Assign the C implementation before running the doctests
     # Patch the __name__, to prevent confusion with the pure Python test
     pyET = test_xml_etree.ET

Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS	(original)
+++ python/branches/py3k/Misc/NEWS	Tue Jan  4 03:07:34 2011
@@ -8,6 +8,10 @@
 Core and Builtins
 -----------------
 
+- Issue #8651: PyArg_Parse*() functions raise an OverflowError if the file
+  doesn't have PY_SSIZE_T_CLEAN define and the size doesn't fit in an int
+  (length bigger than 2^31-1 bytes).
+
 - Issue #9015, #9611: FileIO.readinto(), FileIO.write() and os.write() clamp
   the length to 2^31-1 on Windows.
 

Modified: python/branches/py3k/Python/getargs.c
==============================================================================
--- python/branches/py3k/Python/getargs.c	(original)
+++ python/branches/py3k/Python/getargs.c	Tue Jan  4 03:07:34 2011
@@ -597,7 +597,17 @@
 #define FETCH_SIZE      int *q=NULL;Py_ssize_t *q2=NULL;\
     if (flags & FLAG_SIZE_T) q2=va_arg(*p_va, Py_ssize_t*); \
     else q=va_arg(*p_va, int*);
-#define STORE_SIZE(s)   if (flags & FLAG_SIZE_T) *q2=s; else *q=s;
+#define STORE_SIZE(s)   \
+    if (flags & FLAG_SIZE_T) \
+        *q2=s; \
+    else { \
+        if (INT_MAX < s) { \
+            PyErr_SetString(PyExc_OverflowError, \
+                "size does not fit in an int"); \
+            return converterr("", arg, msgbuf, bufsize); \
+        } \
+        *q=s; \
+    }
 #define BUFFER_LEN      ((flags & FLAG_SIZE_T) ? *q2:*q)
 
     const char *format = *p_format;


More information about the Python-checkins mailing list