I have a piece of code running as an Apache::Registry script under mod_perl that accepts user input and evaluates it. Hopefully, the input is a mathematical expression. In case it is not, I am trying to execture it in a 'Safe' compartment, a la:
use Safe; $compartment = new Safe('userMath'); $result = $compartment->reval($expressionToEval);
The problem is, I want to use the overloaded trig functions from Math::Complex to evaluate things such as sqrt(-4). How can I tell Safe that it is allowed to use Math::Complex?
If I use Math::Complex in the calling package, I can do
$compartment->permit(qw(sqrt));
and the code will then apparently try to use the sqrt() from Math::Complex. However, since it is unaware of things not in the compartment, it fails with
Can't locate object method "make" via package "Math::Complex" at /usr/lib/perl5/5.6.0/Math/Complex.pm line 165.I can't seem to find a way to make Safe aware of the entire Math::Complex package. I have tried strategies like:
and$compartment->share_from('Math::Complex', [ '&make' ]);
$compartment->reval('use Math::Complex');
to no avail. Any suggestions?
In reply to Using Safe to reval complex math by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |