summaryrefslogtreecommitdiff
path: root/src/ejabberd_piefxis.erl
diff options
context:
space:
mode:
authorPaweł Chmielowski <pchmielowski@process-one.net>2020-02-18 15:02:14 +0100
committerPaweł Chmielowski <pchmielowski@process-one.net>2020-02-18 15:02:23 +0100
commita19fdb717bc320a41092195a97bbd2281ae2472e (patch)
treed918a1e2fb4cfdb8387a14964c11b50d86fa663d /src/ejabberd_piefxis.erl
parentUpdate README.md (diff)
Do read piefxis file fully before starting processing included file
Previous method of processing files, could lead to mixing events generated by parsers for multiple files, where we could get in inconsistant state. After this change we gather all events generated by parser for single file, before we start parsing any included file. This fixes issue #3166
Diffstat (limited to 'src/ejabberd_piefxis.erl')
-rw-r--r--src/ejabberd_piefxis.erl25
1 files changed, 17 insertions, 8 deletions
diff --git a/src/ejabberd_piefxis.erl b/src/ejabberd_piefxis.erl
index e4c74177..737ed502 100644
--- a/src/ejabberd_piefxis.erl
+++ b/src/ejabberd_piefxis.erl
@@ -296,17 +296,26 @@ process(#state{xml_stream_state = XMLStreamState, fd = Fd} = State) ->
end.
process_els(State) ->
+ Els = gather_els(State, []),
+ process_els(State, lists:reverse(Els)).
+
+gather_els(State, List) ->
receive
{'$gen_event', El} ->
- case process_el(El, State) of
- {ok, NewState} ->
- process_els(NewState);
- Err ->
- Err
- end
+ gather_els(State, [El | List])
after 0 ->
- {ok, State}
- end.
+ List
+end.
+
+process_els(State, [El | Tail]) ->
+ case process_el(El, State) of
+ {ok, NewState} ->
+ process_els(NewState, Tail);
+ Err ->
+ Err
+ end;
+process_els(State, []) ->
+ {ok, State}.
process_el({xmlstreamstart, <<"server-data">>, Attrs}, State) ->
case fxml:get_attr_s(<<"xmlns">>, Attrs) of