]> granicus.if.org Git - ejabberd/commitdiff
Report better errors on SQL terms decode failure
authorEvgeny Khramtsov <ekhramtsov@process-one.net>
Sun, 19 May 2019 08:22:41 +0000 (11:22 +0300)
committerEvgeny Khramtsov <ekhramtsov@process-one.net>
Sun, 19 May 2019 08:22:41 +0000 (11:22 +0300)
src/ejabberd_sql.erl

index f807b0bca8672f05564f02c5ea8e2ff057312a50..3431e61b8b238bc91488c4b5d8fe854479ef5e22 100644 (file)
@@ -276,9 +276,23 @@ encode_term(Term) ->
 
 decode_term(Bin) ->
     Str = binary_to_list(<<Bin/binary, ".">>),
-    {ok, Tokens, _} = erl_scan:string(Str),
-    {ok, Term} = erl_parse:parse_term(Tokens),
-    Term.
+    try
+       {ok, Tokens, _} = erl_scan:string(Str),
+       {ok, Term} = erl_parse:parse_term(Tokens),
+       Term
+    catch _:{badmatch, {error, {Line, Mod, Reason}, _}} ->
+           ?ERROR_MSG("Corrupted Erlang term in SQL database:~n"
+                      "** Scanner error: at line ~B: ~s~n"
+                      "** Term: ~s",
+                      [Line, Mod:format_error(Reason), Bin]),
+           erlang:error(badarg);
+         _:{badmatch, {error, {Line, Mod, Reason}}} ->
+           ?ERROR_MSG("Corrupted Erlang term in SQL database:~n"
+                      "** Parser error: at line ~B: ~s~n"
+                      "** Term: ~s",
+                      [Line, Mod:format_error(Reason), Bin]),
+           erlang:error(badarg)
+    end.
 
 -spec sqlite_db(binary()) -> atom().
 sqlite_db(Host) ->