Browse Source

decode: catch exception if product out of range

Signed-off-by: Stephan Renatus <srenatus@chef.io>
Stephan Renatus 8 years ago
parent
commit
e37ea31b78
2 changed files with 3 additions and 2 deletions
  1. 2 2
      src/jsone_decode.erl
  2. 1 0
      test/jsone_decode_tests.erl

+ 2 - 2
src/jsone_decode.erl

@@ -274,8 +274,8 @@ number_exponation_part(<<C, Bin/binary>>, N, DecimalOffset, ExpSign, Exp, _, Nex
     number_exponation_part(Bin, N, DecimalOffset, ExpSign, Exp * 10 + C - $0, false, Nexts, Buf, Opt);
 number_exponation_part(<<Bin/binary>>, N, DecimalOffset, ExpSign, Exp, false, Nexts, Buf, Opt) ->
     Pos = ExpSign * Exp - DecimalOffset,
-    try math:pow(10, Pos)
-    of Mag -> next(Bin, N * Mag, Nexts, Buf, Opt)
+    try N * math:pow(10, Pos)
+    of Res -> next(Bin, Res, Nexts, Buf, Opt)
     catch error:badarith ->
         ?ERROR(number_exponation_part, [Bin, N, DecimalOffset, ExpSign, Exp, false, Nexts, Buf, Opt])
     end;

+ 1 - 0
test/jsone_decode_tests.erl

@@ -87,6 +87,7 @@ decode_test_() ->
               ?assertMatch({error, {badarg, _}}, jsone_decode:decode(<<"0.1e--1">>)), % duplicated sign
               ?assertMatch({error, {badarg, _}}, jsone_decode:decode(<<"1e999">>)),   % exponent out of range
               ?assertMatch({error, {badarg, _}}, jsone_decode:decode(<<"0.1e999">>)), % exponent out of range
+              ?assertMatch({error, {badarg, _}}, jsone_decode:decode(<<"100000000000000000000000000000000000e300">>)), % product out of range
               ?assertEqual({ok, 0.1, <<".2">>}, jsone_decode:decode(<<"0.1.2">>))     % duplicated '.': interpreted as individual tokens
       end},