From 2ead5d429fe87ffedf0134d918c3b404e9fa70fe Mon Sep 17 00:00:00 2001 From: Hans Bolinder Date: Wed, 8 Nov 2017 12:41:23 +0100 Subject: stdlib: Do not check base64 input more than needed Often the decode functions return a function_clause error, but not always, and the errors have not been consistent between modifications of the base64 module. Now the errors are returned as they happen--no attempt to make them look nice is done. The alternative, to ensure that, for example, {badarg, Culprit} is always returned upon bad input, was deemed pointless. --- lib/stdlib/src/base64.erl | 6 ++---- lib/stdlib/test/base64_SUITE.erl | 13 +++++++++---- 2 files changed, 11 insertions(+), 8 deletions(-) (limited to 'lib/stdlib') diff --git a/lib/stdlib/src/base64.erl b/lib/stdlib/src/base64.erl index b4ff7b037f..6ea4147abf 100644 --- a/lib/stdlib/src/base64.erl +++ b/lib/stdlib/src/base64.erl @@ -383,8 +383,7 @@ only_ws_binary(<<>>, A) -> A; only_ws_binary(<>, A) -> case b64d(C) of - ws -> only_ws_binary(Cs, A); - _ -> erlang:error(function_clause) + ws -> only_ws_binary(Cs, A) end. decode_list_to_string([C1 | Cs]) -> @@ -427,8 +426,7 @@ only_ws([], A) -> A; only_ws([C | Cs], A) -> case b64d(C) of - ws -> only_ws(Cs, A); - _ -> erlang:error(function_clause) + ws -> only_ws(Cs, A) end. %%%======================================================================== diff --git a/lib/stdlib/test/base64_SUITE.erl b/lib/stdlib/test/base64_SUITE.erl index 1715b2ebe6..1fc4c3fc0e 100644 --- a/lib/stdlib/test/base64_SUITE.erl +++ b/lib/stdlib/test/base64_SUITE.erl @@ -97,10 +97,9 @@ base64_otp_5635(Config) when is_list(Config) -> <<"===">> = base64:decode(base64:encode("===")), ok. %%------------------------------------------------------------------------- -%% OTP-6279: Guard needed so that function fails in a correct -%% way for faulty input, i.e. function_clause. +%% OTP-6279: Make sure illegal characters are rejected when decoding. base64_otp_6279(Config) when is_list(Config) -> - {'EXIT',{function_clause, _}} = (catch base64:decode("dGVzda==a")), + {'EXIT',_} = (catch base64:decode("dGVzda==a")), ok. %%------------------------------------------------------------------------- %% Encode and decode big binaries. @@ -115,7 +114,13 @@ big(Config) when is_list(Config) -> %%------------------------------------------------------------------------- %% Make sure illegal characters are rejected when decoding. illegal(Config) when is_list(Config) -> - {'EXIT',{function_clause, _}} = (catch base64:decode("()")), + %% A few samples with different error reasons. Nothing can be + %% assumed about the reason for the crash. + {'EXIT',_} = (catch base64:decode("()")), + {'EXIT',_} = (catch base64:decode(<<19:8,20:8,21:8,22:8>>)), + {'EXIT',_} = (catch base64:decode([19,20,21,22])), + {'EXIT',_} = (catch base64:decode_to_string(<<19:8,20:8,21:8,22:8>>)), + {'EXIT',_} = (catch base64:decode_to_string([19,20,21,22])), ok. %%------------------------------------------------------------------------- %% mime_decode and mime_decode_to_string have different implementations -- cgit v1.2.3