It sounds to work only with tuple funs, which is going to be removed soon anyway.<div><br><div><span style>OTP-9649  Tuple funs (a two-element tuple with a module name and a</span><br style><span style>             function) are now officially deprecated and will be removed</span><br style>
<span style>             in R16. Use 'fun M:F/A' instead. To make you aware that your</span><br style><span style>             system uses tuple funs, the very first time a tuple fun is</span><br style><span style>             applied, a warning will be sent to the error logger.</span></div>
<div><font color="#222222" face="arial, sans-serif"><br></font><div><div>1> F = fun (M,F,A) -> lists:zipwith3(fun(M, F,A)-> erlang:apply(M, F, A) end, [M], [F], [ A ]) end.</div><div>#Fun<erl_eval.18.59269574></div>
<div>2> F(erlang, time, []).</div><div>** exception exit: restricted shell does not allow time()</div><div>     in function  shell:non_local_allowed/4</div><div>     in call from lists:zipwith3/4</div><div>3> </div>
<div><br></div><div>or am i wrong?</div><div><br><div class="gmail_quote">On Tue, Jan 31, 2012 at 12:46 PM, Roberto Aloi <span dir="ltr"><<a href="mailto:roberto.aloi@erlang-solutions.com">roberto.aloi@erlang-solutions.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi all,<br>
<br>
reading from the Erlang doc:<br>
<br>
<a href="http://www.erlang.org/doc/man/shell.html#start_restricted-1" target="_blank">http://www.erlang.org/doc/man/shell.html#start_restricted-1</a><br>
<br>
"The shell may be started in a restricted mode. In this mode, the shell evaluates a function call only if allowed."<br>
<br>
Let's write a minimal module which whitelists the 'lists' module only:<br>
<br>
=====<br>
-module(restrict).<br>
<br>
-export([local_allowed/3, non_local_allowed/3]).<br>
<br>
-define(NON_LOCAL_ALLOWED, [lists]).<br>
<br>
local_allowed(_Cmd, _Args, State) -><br>
    {false, State}.<br>
<br>
non_local_allowed({Module, _Function}, _Args, State) -><br>
    {lists:member(Module, ?NON_LOCAL_ALLOWED), State}.<br>
=====<br>
<br>
Let's then start a restricted shell, using the above module.<br>
<br>
$ erlc restrict.erl<br>
$ erl -stdlib restricted_shell restrict<br>
<br>
Erlang R14B04 (erts-5.8.5) [source] [64-bit] [smp:4:4] [rq:4] [async-threads:0] [hipe] [kernel-poll:false]<br>
<br>
Restricted Eshell V5.8.5  (abort with ^G)<br>
<br>
And let's see if it works as expected.<br>
<br>
1> erlang:time().<br>
** exception exit: restricted shell does not allow time()<br>
<br>
Cool.<br>
<br>
2> erlang:apply(erlang, time, []).<br>
** exception exit: restricted shell does not allow time()<br>
<br>
Yeah.<br>
<br>
3> F = fun (M,F,A) -> lists:zipwith3({erlang, apply}, [M], [F], [ A ]) end.<br>
#Fun<erl_eval.18.59269574><br>
4> F(erlang, time, []).<br>
[{12,35,45}]<br>
<br>
Ooops.<br>
<br>
Please notice that I'm not the one who actually discovered this bug (or is it a feature?). It was actually one of the <a href="http://tryerlang.org" target="_blank">tryerlang.org</a> users, who kindly informed me about this. Originally I thought this was an application bug, but it is not. This is more generic and it affects the restricted shell itself.<br>

<br>
Best regards,<br>
<br>
Roberto Aloi<br>
---<br>
@robertoaloi<br>
Erlang Solutions Ltd.<br>
<a href="http://www.erlang-solutions.com" target="_blank">www.erlang-solutions.com</a><br>
<br>
_______________________________________________<br>
erlang-bugs mailing list<br>
<a href="mailto:erlang-bugs@erlang.org">erlang-bugs@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-bugs" target="_blank">http://erlang.org/mailman/listinfo/erlang-bugs</a><br>
</blockquote></div><br></div></div></div></div>