[erlang-questions] Trouble with gen_udp:fdopen
Raimo Niskanen
raimo+erlang-questions@REDACTED
Mon Sep 3 09:50:16 CEST 2007
You have found a bug.
I changed the internals from using socket type to using protocol type
sometime during R11, and thought I had found all calls, but
apparently missed the ones in inet_udp.erl (and inet6_udp.erl).
They should use the atom 'udp' instead of 'dgram'.
It will be fixed in R12. A source patch is trivial.
On Sun, Sep 02, 2007 at 12:08:23PM -0600, David Baird wrote:
> Hi,
>
> I am using otp_src_R11B-5 and I have the following code:
>
> #!/usr/bin/env escript
> main(Args) ->
> io:fwrite("Args = ~p ~n", [Args]),
> case Args of
> [_, "-foofd", FDStr] ->
> FD = erlang:list_to_integer(FDStr),
> io:fwrite("FD = ~p ~n", [FD]),
> Res = gen_udp:fdopen(FD, []),
> io:fwrite("Res = ~p~n", [Res])
> end.
>
> When I execute the script using the suid "setuid_socket_wrap.c"
> program (provided with the Erlang sources):
>
> /tmp/setuid_socket_wrap -d -foofd,:123 -- ./client.erl
>
> I get this result:
>
> Args = ["./client.erl","-foofd","3"]
> FD = 3
> Res = {error,eprotonosupport}
>
> Does anyone know what is going on? I think the error is being raised
> in "otp_src_R11B-5/lib/kernel/src/prim_inet.erl" (but I'm not 100%
> sure):
>
> protocol2drv(tcp) -> tcp_inet;
> protocol2drv(udp) -> udp_inet;
> protocol2drv(sctp) -> sctp_inet;
> protocol2drv(_) ->
> erlang:error(eprotonosupport).
>
> I have a suspicion that it might be an incorrect atom ("dgram" instead
> of "udp") in "otp_src_R11B-5/lib/kernel/src/inet_udp.erl:"
>
> open(Port, Opts) when Port >= 0, Port =< 16#ffff ->
> case inet:udp_options(
> [{port,Port}, {recbuf, ?RECBUF} | Opts],
> inet) of
> {error, Reason} -> exit(Reason);
> {ok, R} ->
> Fd = R#udp_opts.fd,
> BAddr = R#udp_opts.ifaddr,
> BPort = R#udp_opts.port,
> SockOpts = R#udp_opts.opts,
> inet:open(Fd,BAddr,BPort,SockOpts,udp,inet,?MODULE) %
> <- good atom
> end.
>
> % <snip>
>
> fdopen(Fd, Opts) ->
> inet:fdopen(Fd,
> optuniquify([{recbuf, ?RECBUF} | Opts]),
> dgram, inet, ?MODULE). % <- bad atom here
>
> In "open," the "udp" atom is used as the Protocol (which matches
> "protocol2drv(udp)" in "prim_inet.erl"). However, "fdopen" is using a
> different atom: "dgram". I looked at "inet_tcp.erl" and it is
> consistent, unlike "inet_udp.erl":
>
> do_connect({A,B,C,D}, Port, Opts, Time) when ?ip(A,B,C,D),
> is_integer(Port) ->
> case inet:connect_options(Opts, inet) of
> {error, Reason} -> exit(Reason);
> {ok, R} ->
> Fd = R#connect_opts.fd,
> BAddr = R#connect_opts.ifaddr,
> BPort = R#connect_opts.port,
> SockOpts = R#connect_opts.opts,
> case inet:open(Fd,BAddr,BPort,SockOpts,tcp,inet,?MODULE) of
> % ...
>
> % <snip>
>
> fdopen(Fd, Opts) ->
> inet:fdopen(Fd, Opts, tcp, inet, ?MODULE).
>
> Any suggestions? Is this a bug or am I doing something wrong?
>
> Thanks,
> David
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://www.erlang.org/mailman/listinfo/erlang-questions
--
/ Raimo Niskanen, Erlang/OTP, Ericsson AB
More information about the erlang-questions
mailing list