[pypy-commit] pypy default: merge heads

bivab noreply at buildbot.pypy.org
Fri Apr 5 17:20:46 CEST 2013


Author: David Schneider <david.schneider at picle.org>
Branch: 
Changeset: r63064:7fdab13dc79c
Date: 2013-04-05 17:19 +0200
http://bitbucket.org/pypy/pypy/changeset/7fdab13dc79c/

Log:	merge heads

diff --git a/pypy/module/pyexpat/interp_pyexpat.py b/pypy/module/pyexpat/interp_pyexpat.py
--- a/pypy/module/pyexpat/interp_pyexpat.py
+++ b/pypy/module/pyexpat/interp_pyexpat.py
@@ -305,14 +305,15 @@
             w_result = space.call_function(handler, %(wargs)s)
             %(post_code)s
         except OperationError, e:
-            parser._exc_info = e
+            if not parser._exc_info: # don't override an existing exception
+                 parser._exc_info = e
             XML_StopParser(parser.itself, XML_FALSE)
             return %(result_error)s
         return %(result_converter)s
     callback = %(name)s_callback
     """ % locals())
 
-    exec str(src)
+    exec src.compile()
 
     c_name = 'XML_Set' + name
     callback_type = lltype.Ptr(lltype.FuncType(
@@ -335,7 +336,8 @@
     try:
         parser.UnknownEncodingHandler(space, name, info)
     except OperationError, e:
-        parser._exc_info = e
+        if parser._exc_info:
+            parser._exc_info = e
         XML_StopParser(parser.itself, XML_FALSE)
         result = 0
     else:
diff --git a/pypy/module/pyexpat/test/test_parser.py b/pypy/module/pyexpat/test/test_parser.py
--- a/pypy/module/pyexpat/test/test_parser.py
+++ b/pypy/module/pyexpat/test/test_parser.py
@@ -167,3 +167,46 @@
             p = pyexpat.ParserCreate()
             p.ParseFile(fake_reader)
             assert fake_reader.read_count == 4
+
+class AppTestPyexpat2:
+    spaceconfig = dict(usemodules=['pyexpat', 'itertools', '_socket',
+                                   'rctime', 'struct', 'binascii'])
+
+    def test_django_bug(self):
+        xml_str = '<?xml version="1.0" standalone="no"?><!DOCTYPE example SYSTEM "http://example.com/example.dtd"><root/>'
+
+        from xml.dom import pulldom
+        from xml.sax import handler
+        from xml.sax.expatreader import ExpatParser as _ExpatParser
+        from StringIO import StringIO
+
+        class DefusedExpatParser(_ExpatParser):
+            def start_doctype_decl(self, name, sysid, pubid, has_internal_subset):
+                raise DTDForbidden(name, sysid, pubid)
+
+            def external_entity_ref_handler(self, context, base, sysid, pubid):
+                raise ExternalReferenceForbidden(context, base, sysid, pubid)
+
+            def reset(self):
+                _ExpatParser.reset(self)
+                parser = self._parser
+                parser.StartDoctypeDeclHandler = self.start_doctype_decl
+                parser.ExternalEntityRefHandler = self.external_entity_ref_handler
+
+
+        class DTDForbidden(ValueError):
+            pass
+
+
+        class ExternalReferenceForbidden(ValueError):
+            pass
+
+        stream = pulldom.parse(StringIO(xml_str), DefusedExpatParser())
+
+        try:
+            for event, node in stream:
+                print event, node
+        except DTDForbidden:
+            pass
+        else:
+            raise Exception("should raise DTDForbidden")


More information about the pypy-commit mailing list