Juerd has asked for the wisdom of the Perl Monks concerning the following question:

Safe is a great module, but I had never had a good excuse to use it. I have now, but now Safe seems to restrict some very important functionality...

I would like to be able to load system-wide modules, but Safe lets me load only modules from the current working directory:

perl -MSafe -e'$s = Safe->new; $s->permit(Opcode::full_opset); $s->rev +al("use TestThingy;"); print $@' This is TestThingy::import
When I try to use the system-wide installed Data::Dumper it gives me this:
3;0 root@ouranos:/home/juerd/modtest# perl -MSafe -e'$s = Safe->new; $ +s->permit(Opcode::full_opset); $s->reval("use Data::Dumper;"); print +$@' Can't load module Data::Dumper, dynamic loading not available in this +perl. (You may need to build a new perl executable which either supports dynamic loading or has the Data::Dumper module statically linked int +o it.) at (eval 2) line 1 Compilation failed in require at (eval 2) line 1. BEGIN failed--compilation aborted at (eval 2) line 1.
My question is obvious: is it possible to disable this restriction?

- Yes, I reinvent wheels.
- Spam: Visit eurotraQ.

Replies are listed 'Best First'.
Re: Safe usage
by Juerd (Abbot) on May 26, 2002 at 13:06 UTC

    No, it is not possible. Safe.pm does not allow for XS modules to be loaded, only pure Perl modules can be loaded. The only way of making XS modules like Data::Dumper work, is by pre-loading them and sharing the symbol table. use them inside of the compartment's package to import the symbols to the right place.

    use Safe; my $safe = Safe->new('Safe::Compartment'); $safe->permit(Opcode::full_opset); for my $module (qw/Data::Dumper/) { (my $file = "$module.pm") =~ s!::!/!g; $safe->share('*' . $module . '::'); package Safe::Compartment; require $file; $module->import(); } $safe->reval(qq{ use Data::Dumper; # Already done, so not needed. print Dumper([ 1..10 ]), "\n"; }); warn $@ if $@;
    This doesn't work well if the module has more namespaces.

    - Yes, I reinvent wheels.
    - Spam: Visit eurotraQ.