summaryrefslogtreecommitdiff
path: root/src/ejabberd_iq.erl
diff options
context:
space:
mode:
authorEvgeny Khramtsov <ekhramtsov@process-one.net>2019-07-08 10:45:13 +0300
committerEvgeny Khramtsov <ekhramtsov@process-one.net>2019-07-08 10:45:13 +0300
commite8eb6bc2b484a51c5bfff0aafe511a844c028dc4 (patch)
tree4df811f1d2bd94fff9e29558fd844ef97b3520b8 /src/ejabberd_iq.erl
parentDebug hooks (diff)
Avoid crashing of ejabberd_iq process on invalid callback
Diffstat (limited to 'src/ejabberd_iq.erl')
-rw-r--r--src/ejabberd_iq.erl12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/ejabberd_iq.erl b/src/ejabberd_iq.erl
index cda5b57c..31297fd2 100644
--- a/src/ejabberd_iq.erl
+++ b/src/ejabberd_iq.erl
@@ -36,6 +36,7 @@
-include("xmpp.hrl").
-include("logger.hrl").
+-include("ejabberd_stacktrace.hrl").
-record(state, {expire = infinity :: timeout()}).
-type state() :: #state{}.
@@ -74,7 +75,8 @@ init([]) ->
{ok, #state{}}.
handle_call(Request, From, State) ->
- {stop, {unexpected_call, Request, From}, State}.
+ ?WARNING_MSG("Unexpected call from ~p: ~p", [From, Request]),
+ noreply(State).
handle_cast({restart_timer, Expire}, State) ->
State1 = State#state{expire = min(Expire, State#state.expire)},
@@ -171,7 +173,13 @@ calc_checksum(Data) ->
-spec callback(atom() | pid(), #iq{} | timeout, term()) -> any().
callback(undefined, IQRes, Fun) ->
- Fun(IQRes);
+ try Fun(IQRes)
+ catch ?EX_RULE(Class, Reason, St) ->
+ StackTrace = ?EX_STACK(St),
+ ?ERROR_MSG("Failed to process iq response:~n~s~n** ~s",
+ [xmpp:pp(IQRes),
+ misc:format_exception(2, Class, Reason, StackTrace)])
+ end;
callback(Proc, IQRes, Ctx) ->
try
Proc ! {iq_reply, IQRes, Ctx}