diff options
author | Ricardo <[email protected]> | 2012-02-04 16:32:21 +0100 |
---|---|---|
committer | Ricardo <[email protected]> | 2012-02-04 16:32:21 +0100 |
commit | 944a57a11a79c5a9bb2f554c921e2e00e7d56c91 (patch) | |
tree | 1fad3a620ff30ddbc0b07b79a4fe35b480db421b /lib/kernel/src/gen_udp.erl | |
parent | ab2ba6f1b0713fbe5c78f67aeefb73ffc006e995 (diff) | |
download | otp-944a57a11a79c5a9bb2f554c921e2e00e7d56c91.tar.gz otp-944a57a11a79c5a9bb2f554c921e2e00e7d56c91.tar.bz2 otp-944a57a11a79c5a9bb2f554c921e2e00e7d56c91.zip |
Fix port leaking after controlling_process(Port, self())
Add case to handle the situation when someone call
{gen_tcp,gen_udp}:controlling_process(Port, self()). Also improve spec
and doc from gen_udp and gen_sctp for controlling_process/2.
To reproduce the issue, open an UDP port:
4> {ok,Port} = gen_udp:open(9000, [binary]).
{ok,#Port<0.587>}
5> gen_udp:controlling_process(Port, self()).
ok
Simulate error:
6> 1=2.
** exception error: no match of right hand side value 2
Here is the leak:
7> inet:i().
Port Module Recv Sent Owner Local Address Foreign Address State
Type
581 inet_udp 0 0 <0.31.0> *:cslistener *:* BOUND
DGRAM
ok
Diffstat (limited to 'lib/kernel/src/gen_udp.erl')
-rw-r--r-- | lib/kernel/src/gen_udp.erl | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/lib/kernel/src/gen_udp.erl b/lib/kernel/src/gen_udp.erl index 8688799ae9..914854c65c 100644 --- a/lib/kernel/src/gen_udp.erl +++ b/lib/kernel/src/gen_udp.erl @@ -185,9 +185,10 @@ connect(S, Address, Port) when is_port(S) -> Error end. --spec controlling_process(Socket, Pid) -> ok when +-spec controlling_process(Socket, Pid) -> ok | {error, Reason} when Socket :: socket(), - Pid :: pid(). + Pid :: pid(), + Reason :: closed | not_owner | inet:posix(). controlling_process(S, NewOwner) -> inet:udp_controlling_process(S, NewOwner). |