diff options
| author | Lars Thorsen <[email protected]> | 2014-09-23 14:30:49 +0200 | 
|---|---|---|
| committer | Lars Thorsen <[email protected]> | 2014-09-23 14:47:06 +0200 | 
| commit | cd14f6b5489060fb22c08e14ab0f74e7f09aa599 (patch) | |
| tree | 9c91f19c6e875ae127c621a2d1a882c0e522ac9d | |
| parent | 743ed31108ee555db18d9833186865e85e34333e (diff) | |
| download | otp-cd14f6b5489060fb22c08e14ab0f74e7f09aa599.tar.gz otp-cd14f6b5489060fb22c08e14ab0f74e7f09aa599.tar.bz2 otp-cd14f6b5489060fb22c08e14ab0f74e7f09aa599.zip  | |
[orber] Fix problem with IPv6 addresses in service context
| -rw-r--r-- | lib/orber/src/orber_iiop_outproxy.erl | 37 | ||||
| -rw-r--r-- | lib/orber/src/orber_iiop_pm.erl | 34 | ||||
| -rw-r--r-- | lib/orber/src/orber_socket.erl | 41 | ||||
| -rw-r--r-- | lib/orber/vsn.mk | 3 | 
4 files changed, 60 insertions, 55 deletions
diff --git a/lib/orber/src/orber_iiop_outproxy.erl b/lib/orber/src/orber_iiop_outproxy.erl index 4ba5b05995..3adb40d01a 100644 --- a/lib/orber/src/orber_iiop_outproxy.erl +++ b/lib/orber/src/orber_iiop_outproxy.erl @@ -113,7 +113,7 @@ stop(Pid) ->  init({connect, Host, Port, SocketType, SocketOptions, Parent, Key, NewKey}) ->      process_flag(trap_exit, true),       case catch orber_socket:connect(SocketType, Host, Port,  -				    get_ip_family_opts(Host) ++ SocketOptions) of +				    orber_socket:get_ip_family_opts(Host) ++ SocketOptions) of  	{'EXCEPTION', _E} ->  	    ignore;  	%% We used to reply the below but since this would generate a CRASH REPORT @@ -508,38 +508,3 @@ clear_queue(Proxy, RequestId, MRef) ->              end      end. -get_ip_family_opts(Host) -> -    case inet:parse_address(Host) of -	{ok, {_,_,_,_}} ->  -	    [inet]; -	{ok, {_,_,_,_,_,_,_,_}} ->  -	    [inet6]; -	{error, einval} -> -	    check_family_for_name(Host, orber_env:ip_version()) -    end. - -check_family_for_name(Host, inet) -> -    case inet:getaddr(Host, inet) of -	{ok, _Address} -> -	    [inet]; -	{error, _} -> -	    case inet:getaddrs(Host, inet6) of -		{ok, _Address} -> -		    [inet6]; -		{error, _} -> -		    [inet] -	    end -    end; -check_family_for_name(Host, inet6) -> -    case inet:getaddr(Host, inet6) of -	{ok, _Address} -> -	    [inet6]; -	{error, _} -> -	    case inet:getaddr(Host, inet) of -		{ok, _Address} -> -		    [inet]; -		{error, _} -> -		    [inet6] -	    end -    end. - diff --git a/lib/orber/src/orber_iiop_pm.erl b/lib/orber/src/orber_iiop_pm.erl index 927d12b3b2..fee2354f11 100644 --- a/lib/orber/src/orber_iiop_pm.erl +++ b/lib/orber/src/orber_iiop_pm.erl @@ -775,12 +775,11 @@ do_setup_connection(PMPid, Host, Port, SocketType, SocketOptions, Chars,  access_allowed(Host, Port, Type, {_,_,UserInterface}) ->      Flags = orber:get_flags(), -    Family = orber_env:ip_version(),      case ?ORB_FLAG_TEST(Flags, ?ORB_ENV_USE_ACL_OUTGOING) of  	false when UserInterface == 0 -> -	    get_local_interface(Type, Family); +	    get_local_interface(Type);  	false -> -	    inet:getaddr(UserInterface, Family); +	    inet:getaddr(UserInterface, get_ip_family(UserInterface));  	true ->  	    SearchFor =   		case Type of @@ -789,43 +788,48 @@ access_allowed(Host, Port, Type, {_,_,UserInterface}) ->  		    ssl ->  			ssl_out  		end, -	    {ok, Ip} = inet:getaddr(Host, Family), +	    {ok, Ip} = inet:getaddr(Host, get_ip_family(Host)),  	    case orber_acl:match(Ip, SearchFor, true) of  		{true, [], 0} -> -		    get_local_interface(Type, Family); +		    get_local_interface(Type);  		{true, [], Port} -> -		    get_local_interface(Type, Family); +		    get_local_interface(Type);  		{true, [], {Min, Max}} when Port >= Min, Port =< Max -> -		    get_local_interface(Type, Family); -		{true, [Interface], 0} -> -		    {ok, NewIp} = inet:getaddr(Interface, Family), +		    get_local_interface(Type); +		{true, [Interface], 0} ->		     +		    {ok, NewIp} = inet:getaddr(Interface, get_ip_family(Interface)),  		    {ok, NewIp, {Host, Port, 0}};  		{true, [Interface], Port} -> -		    {ok, NewIp} = inet:getaddr(Interface, Family), +		     +		    {ok, NewIp} = inet:getaddr(Interface, get_ip_family(Interface)),  		    {ok, NewIp, {Host, Port, 0}};  		{true, [Interface], {Min, Max}} when Port >= Min, Port =< Max -> -		    {ok, NewIp} = inet:getaddr(Interface, Family), +		     +		    {ok, NewIp} = inet:getaddr(Interface, get_ip_family(Interface)),  		    {ok, NewIp, {Host, Port, 0}};  		_ ->  		    false  	    end      end. -get_local_interface(normal, Family) -> +get_local_interface(normal) ->      case orber_env:ip_address_local() of  	[] ->  	    ok;  	[Interface] -> -	    inet:getaddr(Interface, Family) +	    inet:getaddr(Interface, get_ip_family(Interface))      end; -get_local_interface(ssl, Family) -> +get_local_interface(ssl) ->      case orber_env:iiop_ssl_ip_address_local() of  	[] ->  	    ok;  	[Interface] -> -	    inet:getaddr(Interface, Family) +	    inet:getaddr(Interface, get_ip_family(Interface))      end. +get_ip_family(Addr) -> +    [Family] = orber_socket:get_ip_family_opts(Addr), +    Family.  invoke_connection_closed(false) ->      ok; diff --git a/lib/orber/src/orber_socket.erl b/lib/orber/src/orber_socket.erl index c8d2f0636b..4507d90cce 100644 --- a/lib/orber/src/orber_socket.erl +++ b/lib/orber/src/orber_socket.erl @@ -37,7 +37,8 @@  -export([start/0, connect/4, listen/3, listen/4, accept/2, accept/3, write/3,  	 controlling_process/3, close/2, peername/2, sockname/2,   	 peerdata/2, peercert/2, sockdata/2, setopts/3, -	 clear/2, shutdown/3, post_accept/2, post_accept/3]). +	 clear/2, shutdown/3, post_accept/2, post_accept/3, +	 get_ip_family_opts/1]).  %%-----------------------------------------------------------------  %% Internal exports @@ -491,4 +492,40 @@ check_options(ssl, Options, Generation) ->      end. -     +%%----------------------------------------------------------------- +%% Check IP Family.  +get_ip_family_opts(Host) -> +    case inet:parse_address(Host) of +	{ok, {_,_,_,_}} ->  +	    [inet]; +	{ok, {_,_,_,_,_,_,_,_}} ->  +	    [inet6]; +	{error, einval} -> +	    check_family_for_name(Host, orber_env:ip_version()) +    end. + +check_family_for_name(Host, inet) -> +    case inet:getaddr(Host, inet) of +	{ok, _Address} -> +	    [inet]; +	{error, _} -> +	    case inet:getaddr(Host, inet6) of +		{ok, _Address} -> +		    [inet6]; +		{error, _} -> +		    [inet] +	    end +    end; +check_family_for_name(Host, inet6) -> +    case inet:getaddr(Host, inet6) of +	{ok, _Address} -> +	    [inet6]; +	{error, _} -> +	    case inet:getaddr(Host, inet) of +		{ok, _Address} -> +		    [inet]; +		{error, _} -> +		    [inet6] +	    end +    end. + diff --git a/lib/orber/vsn.mk b/lib/orber/vsn.mk index 13bdf55c07..28fe9323fb 100644 --- a/lib/orber/vsn.mk +++ b/lib/orber/vsn.mk @@ -1,2 +1 @@ -ORBER_VSN = 3.7 - +ORBER_VSN = 3.7.1  | 
