Commit c2c58b42 authored by Evan Simpson's avatar Evan Simpson

Prevent traceback leaks.

parent 208e5a18
...@@ -89,7 +89,7 @@ Page Template-specific implementation of TALES, with handlers ...@@ -89,7 +89,7 @@ Page Template-specific implementation of TALES, with handlers
for Python expressions, string literals, and paths. for Python expressions, string literals, and paths.
""" """
__version__='$Revision: 1.22 $'[11:-2] __version__='$Revision: 1.23 $'[11:-2]
import re, sys import re, sys
from TALES import Engine, CompilerError, _valid_name, NAME_RE, \ from TALES import Engine, CompilerError, _valid_name, NAME_RE, \
...@@ -180,8 +180,9 @@ class PathExpr: ...@@ -180,8 +180,9 @@ class PathExpr:
vars = econtext.vars vars = econtext.vars
exists = 0 exists = 0
for base, path, dp in self._paths: for base, path, dp in self._paths:
path = list(path) # Copy!
# Expand dynamic path parts from right to left. # Expand dynamic path parts from right to left.
if dp:
path = list(path) # Copy!
for i, varname in dp: for i, varname in dp:
val = vars[varname] val = vars[varname]
if isinstance(val, StringType): if isinstance(val, StringType):
......
...@@ -87,7 +87,7 @@ ...@@ -87,7 +87,7 @@
An implementation of a generic TALES engine An implementation of a generic TALES engine
""" """
__version__='$Revision: 1.22 $'[11:-2] __version__='$Revision: 1.23 $'[11:-2]
import re, sys, ZTUtils import re, sys, ZTUtils
from MultiMapping import MultiMapping from MultiMapping import MultiMapping
...@@ -108,6 +108,10 @@ class TALESError(Exception): ...@@ -108,6 +108,10 @@ class TALESError(Exception):
def setPosition(self, position): def setPosition(self, position):
self.lineno = position[0] self.lineno = position[0]
self.offset = position[1] self.offset = position[1]
def takeTraceback(self):
t = self.traceback
self.traceback = None
return t
def __str__(self): def __str__(self):
if self.type is None: if self.type is None:
s = self.expression s = self.expression
...@@ -314,8 +318,8 @@ class Context: ...@@ -314,8 +318,8 @@ class Context:
try: try:
v = expression(self) v = expression(self)
if isinstance(v, Exception): if isinstance(v, Exception):
if hasattr(v, 'traceback'): if isinstance(v, TALESError):
raise v, None, v.traceback raise v, None, v.takeTraceback()
raise v raise v
except TALESError, err: except TALESError, err:
err.setPosition(self.position) err.setPosition(self.position)
......
...@@ -87,7 +87,7 @@ ...@@ -87,7 +87,7 @@
Zope object encapsulating a Page Template. Zope object encapsulating a Page Template.
""" """
__version__='$Revision: 1.23 $'[11:-2] __version__='$Revision: 1.24 $'[11:-2]
import os, AccessControl, Acquisition, sys import os, AccessControl, Acquisition, sys
from Globals import DTMLFile, ImageFile, MessageDialog, package_home from Globals import DTMLFile, ImageFile, MessageDialog, package_home
...@@ -275,7 +275,8 @@ class ZopePageTemplate(Script, PageTemplate, Historical, Cacheable, ...@@ -275,7 +275,8 @@ class ZopePageTemplate(Script, PageTemplate, Historical, Cacheable,
result = self.pt_render(extra_context=bound_names) result = self.pt_render(extra_context=bound_names)
except TALESError, err: except TALESError, err:
if err.type == 'Unauthorized': if err.type == 'Unauthorized':
raise err.type, err.value, err.traceback raise err.type, err.value, err.takeTraceback()
err.takeTraceback()
raise raise
if keyset is not None: if keyset is not None:
# Store the result in the cache. # Store the result in the cache.
......
...@@ -140,6 +140,11 @@ class TALESError(TALError): ...@@ -140,6 +140,11 @@ class TALESError(TALError):
# This exception can carry around another exception + traceback # This exception can carry around another exception + traceback
def takeTraceback(self):
t = self.info[2]
self.info = self.info[:2] + (None,)
return t
def __init__(self, msg, position=(None, None), info=(None, None, None)): def __init__(self, msg, position=(None, None), info=(None, None, None)):
t, v, tb = info t, v, tb = info
if t: if t:
......
...@@ -637,7 +637,10 @@ class TALInterpreter: ...@@ -637,7 +637,10 @@ class TALInterpreter:
engine.beginScope() engine.beginScope()
err.lineno, err.offset = self.position err.lineno, err.offset = self.position
engine.setLocal('error', err) engine.setLocal('error', err)
try:
self.interpret(handler) self.interpret(handler)
finally:
err.takeTraceback()
engine.endScope() engine.endScope()
else: else:
self.restoreOutputState(state) self.restoreOutputState(state)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment