fix(erlang): validate tuple segment ranges in ip2region_util
This commit is contained in:
parent
b1eb00e25e
commit
e50ead2cba
|
|
@ -11,11 +11,15 @@
|
||||||
|
|
||||||
-export([ipv4_to_n/1, ip_version/1, ip_to_bytes/1]).
|
-export([ipv4_to_n/1, ip_version/1, ip_to_bytes/1]).
|
||||||
|
|
||||||
|
-define(IS_UINT8(V), is_integer(V), V >= 0, V =< 255).
|
||||||
|
-define(IS_UINT16(V), is_integer(V), V >= 0, V =< 65535).
|
||||||
|
|
||||||
-spec ip_version(Ip :: tuple() | list() | binary() | integer()) ->
|
-spec ip_version(Ip :: tuple() | list() | binary() | integer()) ->
|
||||||
ipv4 | ipv6 | {error, atom()}.
|
ipv4 | ipv6 | {error, atom()}.
|
||||||
ip_version(Ip) when is_integer(Ip), Ip >= 0, Ip =< 16#FFFFFFFF -> ipv4;
|
ip_version(Ip) when is_integer(Ip), Ip >= 0, Ip =< 16#FFFFFFFF -> ipv4;
|
||||||
ip_version({_, _, _, _}) -> ipv4;
|
ip_version({A, B, C, D}) when ?IS_UINT8(A), ?IS_UINT8(B), ?IS_UINT8(C), ?IS_UINT8(D) -> ipv4;
|
||||||
ip_version({_, _, _, _, _, _, _, _}) -> ipv6;
|
ip_version({A, B, C, D, E, F, G, H}) when ?IS_UINT16(A), ?IS_UINT16(B), ?IS_UINT16(C), ?IS_UINT16(D),
|
||||||
|
?IS_UINT16(E), ?IS_UINT16(F), ?IS_UINT16(G), ?IS_UINT16(H) -> ipv6;
|
||||||
ip_version(Ip) when is_binary(Ip) ->
|
ip_version(Ip) when is_binary(Ip) ->
|
||||||
ip_version(binary_to_list(Ip));
|
ip_version(binary_to_list(Ip));
|
||||||
ip_version(Ip) when is_list(Ip) ->
|
ip_version(Ip) when is_list(Ip) ->
|
||||||
|
|
@ -31,9 +35,10 @@ ip_version(_) ->
|
||||||
{ok, ipv4 | ipv6, binary()} | {error, atom()}.
|
{ok, ipv4 | ipv6, binary()} | {error, atom()}.
|
||||||
ip_to_bytes(Ip) when is_integer(Ip), Ip >= 0, Ip =< 16#FFFFFFFF ->
|
ip_to_bytes(Ip) when is_integer(Ip), Ip >= 0, Ip =< 16#FFFFFFFF ->
|
||||||
{ok, ipv4, <<Ip:32>>};
|
{ok, ipv4, <<Ip:32>>};
|
||||||
ip_to_bytes({A, B, C, D}) ->
|
ip_to_bytes({A, B, C, D}) when ?IS_UINT8(A), ?IS_UINT8(B), ?IS_UINT8(C), ?IS_UINT8(D) ->
|
||||||
{ok, ipv4, <<A, B, C, D>>};
|
{ok, ipv4, <<A, B, C, D>>};
|
||||||
ip_to_bytes({A, B, C, D, E, F, G, H}) ->
|
ip_to_bytes({A, B, C, D, E, F, G, H}) when ?IS_UINT16(A), ?IS_UINT16(B), ?IS_UINT16(C), ?IS_UINT16(D),
|
||||||
|
?IS_UINT16(E), ?IS_UINT16(F), ?IS_UINT16(G), ?IS_UINT16(H) ->
|
||||||
{ok, ipv6, <<A:16, B:16, C:16, D:16, E:16, F:16, G:16, H:16>>};
|
{ok, ipv6, <<A:16, B:16, C:16, D:16, E:16, F:16, G:16, H:16>>};
|
||||||
ip_to_bytes(Ip) when is_binary(Ip) ->
|
ip_to_bytes(Ip) when is_binary(Ip) ->
|
||||||
ip_to_bytes(binary_to_list(Ip));
|
ip_to_bytes(binary_to_list(Ip));
|
||||||
|
|
@ -52,7 +57,7 @@ ip_to_bytes(_) ->
|
||||||
-spec ipv4_to_n(Ip :: tuple() | list() | binary() | integer()) ->
|
-spec ipv4_to_n(Ip :: tuple() | list() | binary() | integer()) ->
|
||||||
non_neg_integer() | {error, atom()}.
|
non_neg_integer() | {error, atom()}.
|
||||||
ipv4_to_n(IntIp) when is_integer(IntIp), IntIp >= 0, IntIp =< 16#FFFFFFFF -> IntIp;
|
ipv4_to_n(IntIp) when is_integer(IntIp), IntIp >= 0, IntIp =< 16#FFFFFFFF -> IntIp;
|
||||||
ipv4_to_n({A, B, C, D}) ->
|
ipv4_to_n({A, B, C, D}) when ?IS_UINT8(A), ?IS_UINT8(B), ?IS_UINT8(C), ?IS_UINT8(D) ->
|
||||||
<<N:32>> = <<A, B, C, D>>,
|
<<N:32>> = <<A, B, C, D>>,
|
||||||
N;
|
N;
|
||||||
ipv4_to_n(Ip) when is_binary(Ip) ->
|
ipv4_to_n(Ip) when is_binary(Ip) ->
|
||||||
|
|
|
||||||
|
|
@ -34,8 +34,15 @@ invalid_inputs_test_() ->
|
||||||
?_assertEqual({error, bad_ip_format}, ip2region_util:ip_to_bytes(atom)),
|
?_assertEqual({error, bad_ip_format}, ip2region_util:ip_to_bytes(atom)),
|
||||||
?_assertEqual({error, bad_ip_format}, ip2region_util:ip_to_bytes(-1)),
|
?_assertEqual({error, bad_ip_format}, ip2region_util:ip_to_bytes(-1)),
|
||||||
?_assertEqual({error, bad_ip_format}, ip2region_util:ip_to_bytes(16#100000000)),
|
?_assertEqual({error, bad_ip_format}, ip2region_util:ip_to_bytes(16#100000000)),
|
||||||
|
?_assertEqual({error, bad_ip_format}, ip2region_util:ip_to_bytes({256, 0, 0, 1})),
|
||||||
|
?_assertEqual({error, bad_ip_format}, ip2region_util:ip_to_bytes({-1, 0, 0, 0})),
|
||||||
|
?_assertEqual({error, bad_ip_format},
|
||||||
|
ip2region_util:ip_to_bytes({0, 0, 0, 0, 0, 0, 0, 65536})),
|
||||||
|
?_assertEqual({error, bad_ip_format},
|
||||||
|
ip2region_util:ip_to_bytes({0, 0, 0, 0, 0, 0, 0, -1})),
|
||||||
?_assertEqual({error, bad_ip_format}, ip2region_util:ipv4_to_n(-1)),
|
?_assertEqual({error, bad_ip_format}, ip2region_util:ipv4_to_n(-1)),
|
||||||
?_assertEqual({error, bad_ip_format}, ip2region_util:ipv4_to_n(16#100000000))
|
?_assertEqual({error, bad_ip_format}, ip2region_util:ipv4_to_n(16#100000000)),
|
||||||
|
?_assertEqual({error, bad_ip_format}, ip2region_util:ipv4_to_n({256, 0, 0, 1}))
|
||||||
].
|
].
|
||||||
|
|
||||||
ip_version_test_() ->
|
ip_version_test_() ->
|
||||||
|
|
@ -45,6 +52,8 @@ ip_version_test_() ->
|
||||||
?_assertEqual(ipv4, ip2region_util:ip_version(16779264 + 1)),
|
?_assertEqual(ipv4, ip2region_util:ip_version(16779264 + 1)),
|
||||||
?_assertEqual({error, bad_ip_format}, ip2region_util:ip_version("::ggg")),
|
?_assertEqual({error, bad_ip_format}, ip2region_util:ip_version("::ggg")),
|
||||||
?_assertEqual({error, bad_ip_format}, ip2region_util:ip_version({1,2,3})),
|
?_assertEqual({error, bad_ip_format}, ip2region_util:ip_version({1,2,3})),
|
||||||
|
?_assertEqual({error, bad_ip_format}, ip2region_util:ip_version({256,0,0,1})),
|
||||||
|
?_assertEqual({error, bad_ip_format}, ip2region_util:ip_version({0,0,0,0,0,0,0,65536})),
|
||||||
?_assertEqual({error, bad_ip_format}, ip2region_util:ip_version(16#100000000))
|
?_assertEqual({error, bad_ip_format}, ip2region_util:ip_version(16#100000000))
|
||||||
].
|
].
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue