[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