summaryrefslogtreecommitdiff
path: root/lib/kernel/src/inet_dns.erl
diff options
context:
space:
mode:
authorRaimo Niskanen <raimo@erlang.org>2020-11-10 14:22:59 +0100
committerRaimo Niskanen <raimo@erlang.org>2020-11-10 14:22:59 +0100
commit0525bb4b881f381cde948007a87a118d60807fe0 (patch)
treeb5542cf96faf53a407448937c3f9a2b3e61d9d71 /lib/kernel/src/inet_dns.erl
parentfe92cecc1f721d862578b3889fe2e5f364bc79df (diff)
downloaderlang-0525bb4b881f381cde948007a87a118d60807fe0.tar.gz
Fix encode/decode of CAA records
Diffstat (limited to 'lib/kernel/src/inet_dns.erl')
-rw-r--r--lib/kernel/src/inet_dns.erl24
1 files changed, 21 insertions, 3 deletions
diff --git a/lib/kernel/src/inet_dns.erl b/lib/kernel/src/inet_dns.erl
index 5c5ef20d41..a70f360eb9 100644
--- a/lib/kernel/src/inet_dns.erl
+++ b/lib/kernel/src/inet_dns.erl
@@ -477,7 +477,7 @@ decode_data(<<Order:16,Preference:16,Data0/binary>>, _, ?S_NAPTR, Buffer) ->
{Data2,Services} = decode_string(Data1),
{Data,Regexp} = decode_characters(Data2, utf8),
Replacement = decode_domain(Data, Buffer),
- {Order,Preference,string:lowercase(Flags),string:lowercase(Services),
+ {Order,Preference,to_lower(Flags),to_lower(Services),
Regexp,Replacement};
%% ?S_OPT falls through to default
decode_data(Data, _, ?S_TXT, _) ->
@@ -486,8 +486,13 @@ decode_data(Data, _, ?S_SPF, _) ->
decode_txt(Data);
decode_data(Data, _, ?S_URI, _) ->
decode_txt(Data);
-decode_data(Data, _, ?S_CAA, _) ->
- decode_txt(Data);
+decode_data(<<Flags:8,Data0/binary>>, _, ?S_CAA, _) ->
+ {Data1,Tag} = decode_string(Data0),
+ L = length(Tag),
+ (1 =< L andalso L =< 15)
+ orelse throw(?DECODE_ERROR),
+ Value = binary_to_list(Data1),
+ {Flags,to_lower(Tag),Value};
%% sofar unknown or non standard
decode_data(Data, _, _, _) ->
Data.
@@ -589,6 +594,14 @@ decode_name_label(Label, Name, N) ->
erlang:error(badarg, [Label,Name,N])
end.
+%% Just lowercase ASCII A..Z
+to_lower([C | Cs]) when $A =< C, C =< $Z ->
+ [C + 32 | to_lower(Cs)];
+to_lower([C | Cs]) ->
+ [C | to_lower(Cs)];
+to_lower([]) ->
+ [].
+
%%
%% Data field -> {binary(),NewCompressionTable}
%%
@@ -639,6 +652,11 @@ encode_data(Comp, Pos, ?S_NAPTR, in,
encode_data(Comp, _, ?S_TXT, in, Data) -> {encode_txt(Data),Comp};
encode_data(Comp, _, ?S_SPF, in, Data) -> {encode_txt(Data),Comp};
encode_data(Comp, _, ?S_URI, in, Data) -> {encode_txt(Data),Comp};
+encode_data(Comp, _, ?S_CAA, in, {Flags,Tag,Value}) ->
+ B0 = <<Flags:8>>,
+ B1 = encode_string(B0, iolist_to_binary(Tag)),
+ B2 = iolist_to_binary(Value),
+ {<<B1/binary,B2/binary>>,Comp};
encode_data(Comp, _, ?S_CAA, in, Data) -> {encode_txt(Data),Comp};
encode_data(Comp, _Pos, _Type, _Class, Data) -> {iolist_to_binary(Data),Comp}.