diff options
author | Zandra Norman <[email protected]> | 2017-04-28 12:13:47 +0200 |
---|---|---|
committer | Zandra Norman <[email protected]> | 2017-04-28 12:13:47 +0200 |
commit | 0ddb50ea9cd846610929060e54c1310dcb55039d (patch) | |
tree | d217a9a04e79ee01cd4bf143e7ac78a259658920 /lib/kernel/src | |
parent | 28bd10ec91b3e73aaef8756c6aa8b8daf92dfe9d (diff) | |
parent | 25952bf726e4dc20fb3e2067e0b92c55932ce616 (diff) | |
download | otp-0ddb50ea9cd846610929060e54c1310dcb55039d.tar.gz otp-0ddb50ea9cd846610929060e54c1310dcb55039d.tar.bz2 otp-0ddb50ea9cd846610929060e54c1310dcb55039d.zip |
Merge branch 'zandra/kernel/nodenames/OTP-13805'
* zandra/kernel/nodenames/OTP-13805:
kernel: Do not allow unicode in nodenames
Diffstat (limited to 'lib/kernel/src')
-rw-r--r-- | lib/kernel/src/net_kernel.erl | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/lib/kernel/src/net_kernel.erl b/lib/kernel/src/net_kernel.erl index 0a9f9316b0..9921a0adfd 100644 --- a/lib/kernel/src/net_kernel.erl +++ b/lib/kernel/src/net_kernel.erl @@ -1262,11 +1262,22 @@ create_name(Name, LongOrShortNames, Try) -> {Head,Host1} = create_hostpart(Name, LongOrShortNames), case Host1 of {ok,HostPart} -> - {ok,list_to_atom(Head ++ HostPart)}; + case valid_name_head(Head) of + true -> + {ok,list_to_atom(Head ++ HostPart)}; + false -> + error_logger:info_msg("Invalid node name!\n" + "Please check your configuration\n"), + {error, badarg} + end; {error,long} when Try =:= 1 -> %% It could be we haven't read domain name from resolv file yet inet_config:do_load_resolv(os:type(), longnames), create_name(Name, LongOrShortNames, 0); + {error, hostname_not_allowed} -> + error_logger:info_msg("Invalid node name!\n" + "Please check your configuration\n"), + {error, badarg}; {error,Type} -> error_logger:info_msg( lists:concat(["Can\'t set ", @@ -1279,12 +1290,13 @@ create_name(Name, LongOrShortNames, Try) -> create_hostpart(Name, LongOrShortNames) -> {Head,Host} = split_node(Name), Host1 = case {Host,LongOrShortNames} of - {[$@,_|_],longnames} -> - {ok,Host}; + {[$@,_|_] = Host,longnames} -> + validate_hostname(Host); {[$@,_|_],shortnames} -> case lists:member($.,Host) of true -> {error,short}; - _ -> {ok,Host} + _ -> + validate_hostname(Host) end; {_,shortnames} -> case inet_db:gethostname() of @@ -1304,6 +1316,24 @@ create_hostpart(Name, LongOrShortNames) -> end, {Head,Host1}. +validate_hostname([$@|HostPart] = Host) -> + {ok, MP} = re:compile("^[!-ΓΏ]*$", [unicode]), + case re:run(HostPart, MP) of + {match, _} -> + {ok, Host}; + nomatch -> + {error, hostname_not_allowed} + end. + +valid_name_head(Head) -> + {ok, MP} = re:compile("^[0-9A-Za-z_\\-]*$", [unicode]), + case re:run(Head, MP) of + {match, _} -> + true; + nomatch -> + false + end. + split_node(Name) -> lists:splitwith(fun(C) -> C =/= $@ end, atom_to_list(Name)). |