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

Skip to content

Commit cc2c291

Browse files
committed
Patch by Sjoerd Mullender to placate /F:
Fix leaking of instances by removing the elements variable that we created on closing the parser. The elements variable is now created in the reset() method, so that the sequence close(); reset(); ... works. Also, add the name of the entity reference that wasn't found to the error message.
1 parent 7e3535c commit cc2c291

1 file changed

Lines changed: 12 additions & 4 deletions

File tree

Lib/xmllib.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,11 +88,11 @@ class XMLParser:
8888

8989
# Interface -- initialize and reset this instance
9090
def __init__(self):
91+
self.__fixed = 0
9192
self.reset()
92-
if self.elements is XMLParser.elements:
93-
self.__fixelements()
9493

9594
def __fixelements(self):
95+
self.__fixed = 1
9696
self.elements = {}
9797
self.__fixdict(self.__dict__)
9898
self.__fixclass(self.__class__)
@@ -127,6 +127,10 @@ def reset(self):
127127
self.__seen_starttag = 0
128128
self.__use_namespaces = 0
129129
self.__namespaces = {'xml':None} # xml is implicitly declared
130+
# backward compatipibility hack: if elements not overridden,
131+
# fill it in ourselves
132+
if self.elements is XMLParser.elements:
133+
self.__fixelements()
130134

131135
# For derived classes only -- enter literal mode (CDATA) till EOF
132136
def setnomoretags(self):
@@ -147,6 +151,10 @@ def feed(self, data):
147151
# Interface -- handle the remaining data
148152
def close(self):
149153
self.goahead(1)
154+
if self.__fixed:
155+
self.__fixed = 0
156+
# remove self.elements so that we don't leak
157+
del self.elements
150158

151159
# Interface -- translate references
152160
def translate_references(self, data, all = 1):
@@ -179,7 +187,7 @@ def translate_references(self, data, all = 1):
179187
data = pre + self.entitydefs[str] + post
180188
i = res.start(0) # rescan substituted text
181189
else:
182-
self.syntax_error('reference to unknown entity')
190+
self.syntax_error("reference to unknown entity `&%s;'" % str)
183191
# can't do it, so keep the entity ref in
184192
data = pre + '&' + str + ';' + post
185193
i = res.start(0) + len(str) + 2
@@ -327,7 +335,7 @@ def goahead(self, end):
327335
n = len(rawdata)
328336
i = res.start(0)
329337
else:
330-
self.syntax_error('reference to unknown entity')
338+
self.syntax_error("reference to unknown entity `&%s;'" % name)
331339
self.unknown_entityref(name)
332340
self.lineno = self.lineno + string.count(res.group(0), '\n')
333341
continue

0 commit comments

Comments
 (0)