From 0de24bf983bbed6bcf544571bbdfef6d6ff802b0 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Wed, 20 Feb 2013 11:22:59 +0100 Subject: [PATCH 1/3] [IMP] safe_eval: do not log exceptions, when re-raising a new exception, make the stacktrace complete. bzr revid: vmt@openerp.com-20130220102259-avee8fx2a1kpdog3 --- openerp/tools/safe_eval.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/openerp/tools/safe_eval.py b/openerp/tools/safe_eval.py index b99de385af3..c56c94efdfd 100644 --- a/openerp/tools/safe_eval.py +++ b/openerp/tools/safe_eval.py @@ -106,11 +106,11 @@ def test_expr(expr, allowed_codes, mode="eval"): expr = expr.strip() code_obj = compile(expr, "", mode) except (SyntaxError, TypeError): - _logger.debug('Invalid eval expression', exc_info=True) raise - except Exception: - _logger.debug('Disallowed or invalid eval expression', exc_info=True) - raise ValueError("%s is not a valid expression" % expr) + except Exception, e: + import sys + exc_info = sys.exc_info() + raise ValueError, '"%s" while compiling\n%s' % (str(e), expr), exc_info[2] for code in _get_opcodes(code_obj): if code not in allowed_codes: raise ValueError("opcode %s not allowed (%r)" % (opname[code], expr)) @@ -237,10 +237,7 @@ def safe_eval(expr, globals_dict=None, locals_dict=None, mode="eval", nocopy=Fal 'set' : set } ) - try: - return eval(test_expr(expr, _SAFE_OPCODES, mode=mode), globals_dict, locals_dict) - except Exception: - _logger.exception('Cannot eval %r', expr) - raise + c = test_expr(expr, _SAFE_OPCODES, mode=mode) + return eval(c, globals_dict, locals_dict) # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: From c62780673cc927c438a5f310a7b9fe295f00bbee Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Mon, 25 Feb 2013 17:35:25 +0100 Subject: [PATCH 2/3] [FIX] tools.safe_eval: we want to see the expr which fail to eval(), so report it in the exception. bzr revid: vmt@openerp.com-20130225163525-3g9qw1g3hkyyxf1j --- openerp/tools/safe_eval.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/openerp/tools/safe_eval.py b/openerp/tools/safe_eval.py index c56c94efdfd..67caf3a2a10 100644 --- a/openerp/tools/safe_eval.py +++ b/openerp/tools/safe_eval.py @@ -35,6 +35,8 @@ from opcode import HAVE_ARGUMENT, opmap, opname from types import CodeType import logging +from .misc import ustr + __all__ = ['test_expr', 'safe_eval', 'const_eval'] # The time module is usually already provided in the safe_eval environment @@ -110,7 +112,7 @@ def test_expr(expr, allowed_codes, mode="eval"): except Exception, e: import sys exc_info = sys.exc_info() - raise ValueError, '"%s" while compiling\n%s' % (str(e), expr), exc_info[2] + raise ValueError, '"%s" while compiling\n%r' % (ustr(e), expr), exc_info[2] for code in _get_opcodes(code_obj): if code not in allowed_codes: raise ValueError("opcode %s not allowed (%r)" % (opname[code], expr)) @@ -238,6 +240,11 @@ def safe_eval(expr, globals_dict=None, locals_dict=None, mode="eval", nocopy=Fal } ) c = test_expr(expr, _SAFE_OPCODES, mode=mode) - return eval(c, globals_dict, locals_dict) + try: + return eval(c, globals_dict, locals_dict) + except Exception, e: + import sys + exc_info = sys.exc_info() + raise ValueError, '"%s" while evaluating\n%r' % (ustr(e), expr), exc_info[2] # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: From d43dba744c9f74c397d1614ee254af4369f855e2 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Tue, 26 Feb 2013 10:44:46 +0100 Subject: [PATCH 3/3] safe_eval: re-raise the same exception type when completing it. bzr revid: vmt@openerp.com-20130226094446-7c2dw5c5eou0lg8r --- openerp/tools/safe_eval.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/tools/safe_eval.py b/openerp/tools/safe_eval.py index 67caf3a2a10..49244d92e81 100644 --- a/openerp/tools/safe_eval.py +++ b/openerp/tools/safe_eval.py @@ -245,6 +245,6 @@ def safe_eval(expr, globals_dict=None, locals_dict=None, mode="eval", nocopy=Fal except Exception, e: import sys exc_info = sys.exc_info() - raise ValueError, '"%s" while evaluating\n%r' % (ustr(e), expr), exc_info[2] + raise exc_info[0], '"%s" while evaluating\n%r' % (ustr(e), expr), exc_info[2] # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: