Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:24
erlang
0367-Revise-handling-of-IPv4-compatible-IPv6-ad...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0367-Revise-handling-of-IPv4-compatible-IPv6-address-look.patch of Package erlang
From f52792b570a9d27f724fa0a107519b8f449c3de2 Mon Sep 17 00:00:00 2001 From: Raimo Niskanen <raimo@erlang.org> Date: Fri, 2 Jul 2021 12:09:27 +0200 Subject: [PATCH 7/8] Revise handling of IPv4-compatible IPv6 address lookup --- lib/kernel/src/inet_db.erl | 43 +++++++++++++++++-------------------- lib/kernel/src/inet_res.erl | 16 +++++++++++++- 2 files changed, 35 insertions(+), 24 deletions(-) diff --git a/lib/kernel/src/inet_db.erl b/lib/kernel/src/inet_db.erl index 4644bea344..f95d8c0eec 100644 --- a/lib/kernel/src/inet_db.erl +++ b/lib/kernel/src/inet_db.erl @@ -773,11 +773,11 @@ gethostbyaddr(Domain, IP) -> %% res_gethostbyaddr (newly resolved version) %% match data field directly and cache RRs. %% -res_gethostbyaddr(Name, IP, Rec) -> +res_gethostbyaddr(Domain, IP, Rec) -> RRs = res_filter_rrs(?S_PTR, Rec#dns_rec.anlist), ?dbg("res_gethostbyaddr: ~p - ~p~n", [IP, RRs]), LookupFun = res_lookup_fun(RRs), - case resolve_cnames(Name, ?S_PTR, LookupFun) of + case resolve_cnames(Domain, ?S_PTR, LookupFun) of {error, _} = Error -> Error; {_D, Domains, _Aliases} -> @@ -791,31 +791,28 @@ res_gethostbyaddr(Name, IP, Rec) -> end. ent_gethostbyaddr([Domain], IP) -> - {IP_1, AddrType, Length} = norm_ip(IP), - H = - #hostent{ - h_name = Domain, - h_aliases = [], - h_addr_list = [IP_1], - h_addrtype = AddrType, - h_length = Length }, - {ok, H}; + HEnt = + if + tuple_size(IP) =:= 4 -> + #hostent{ + h_name = Domain, + h_aliases = [], + h_addr_list = [IP], + h_addrtype = inet, + h_length = 4}; + tuple_size(IP) =:= 8 -> + #hostent{ + h_name = Domain, + h_aliases = [], + h_addr_list = [IP], + h_addrtype = inet6, + h_length = 16} + end, + {ok, HEnt}; ent_gethostbyaddr([_ | _] = _Domains, _IP) -> ?dbg("gethostbyaddr duplicate domains=~p~n", [_Domains]), {error, nxdomain}. -%% Normalize an IPv4-compatible IPv6 address -%% into a plain IPv4 address -%% -norm_ip(IP) when tuple_size(IP) =:= 4 -> - {IP, inet, 4}; -norm_ip({0,0,0,0,0,16#ffff,G,H}) -> - A = G bsr 8, B = G band 16#ff, C = H bsr 8, D = H band 16#ff, - {{A,B,C,D}, inet, 4}; -norm_ip(IP) when tuple_size(IP) =:= 8 -> - {IP, inet6, 16}. - - %% %% Register socket Modules diff --git a/lib/kernel/src/inet_res.erl b/lib/kernel/src/inet_res.erl index f5ab7e6a23..fda656831e 100644 --- a/lib/kernel/src/inet_res.erl +++ b/lib/kernel/src/inet_res.erl @@ -363,7 +363,12 @@ gethostbyaddr_tm(Addr, Timer) when is_list(Addr) -> _Error -> {error, formerr} end; gethostbyaddr_tm(IP, Timer) -> - case dn_ip(IP) of + %% The call to norm_ip/1 here translates a lookup of + %% ::ffff:A.B.C.D (AAAA in ...ip6.arpa) into a plain + %% A.B.C.D (A in ...in-addr.arpa) lookup, and pretends + %% the result as if it was from the original IPv6 lookup + %% + case dn_ip(norm_ip(IP)) of {error, _} = Error -> Error; Name -> @@ -1203,6 +1208,15 @@ dn_hex(N, Tail) when is_integer(N) -> [(N - 10) + $a, $. | Tail] end. +%% Normalize an IPv4-compatible IPv6 address +%% into a plain IPv4 address +%% +norm_ip({0,0,0,0,0,16#ffff,G,H}) -> + A = G bsr 8, B = G band 16#ff, C = H bsr 8, D = H band 16#ff, + {A,B,C,D}; +norm_ip(IP) -> + IP. + dns_msg([]) -> []; -- 2.31.1
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor