File 1226-Fix-join-of-name-with-search-domain.patch of Package erlang

From 7b1932db4e0f2654a66abf9b6ed8a0b89865107a Mon Sep 17 00:00:00 2001
From: Raimo Niskanen <raimo@erlang.org>
Date: Fri, 28 May 2021 17:52:42 +0200
Subject: [PATCH] Fix join of name with search domain "."

---
 lib/kernel/src/inet_res.erl | 32 +++++++++++++++++++++-----------
 1 file changed, 21 insertions(+), 11 deletions(-)

diff --git a/lib/kernel/src/inet_res.erl b/lib/kernel/src/inet_res.erl
index e323ad0caf..b6277e4e0a 100644
--- a/lib/kernel/src/inet_res.erl
+++ b/lib/kernel/src/inet_res.erl
@@ -529,31 +529,41 @@ type_p(Type) ->
 %%
 res_getbyname(Name, Type, Timer) ->
     {EmbeddedDots, TrailingDot} = inet_parse:dots(Name),
-    Dot = if TrailingDot -> ""; true -> "." end,
-    if  TrailingDot ->
-	    res_getby_query(Name, Type, Timer);
+    if
+        TrailingDot ->
+	    res_getby_query(lists:droplast(Name), Type, Timer);
 	EmbeddedDots =:= 0 ->
-	    res_getby_search(Name, Dot,
-			     inet_db:get_searchlist(),
+	    res_getby_search(Name, inet_db:get_searchlist(),
 			     nxdomain, Type, Timer);
 	true ->
 	    case res_getby_query(Name, Type, Timer) of
 		{error,_Reason}=Error ->
-		    res_getby_search(Name, Dot,
-				     inet_db:get_searchlist(),
+		    res_getby_search(Name, inet_db:get_searchlist(),
 				     Error, Type, Timer);
 		Other -> Other
 	    end
     end.
 
-res_getby_search(Name, Dot, [Dom | Ds], _Reason, Type, Timer) ->
-    case res_getby_query(Name++Dot++Dom, Type, Timer,
+res_getby_search(Name, [Dom | Ds], _Reason, Type, Timer) ->
+    QueryName =
+        %% Join Name and Dom with a single dot.
+        %% Allow Dom to be "." or "", but not to lead with ".".
+        %% Do not allow Name to be "".
+        if
+            Name =/= "" andalso (Dom =:= "." orelse Dom =:= "") ->
+                Name;
+            Name =/= "" andalso hd(Dom) =/= $. ->
+                Name++"."++Dom;
+            true ->
+                erlang:error({if_clause, Name, Dom})
+        end,
+    case res_getby_query(QueryName, Type, Timer,
 			 inet_db:res_option(nameservers)) of
 	{ok, HEnt}         -> {ok, HEnt};
 	{error, NewReason} ->
-	    res_getby_search(Name, Dot, Ds, NewReason, Type, Timer)
+	    res_getby_search(Name, Ds, NewReason, Type, Timer)
     end;
-res_getby_search(_Name, _, [], Reason,_,_) ->
+res_getby_search(_Name, [], Reason,_,_) ->
     {error, Reason}.
 
 res_getby_query(Name, Type, Timer) ->
-- 
2.26.2

openSUSE Build Service is sponsored by