diff options
author | Paweł Chmielowski <pchmielowski@process-one.net> | 2020-02-18 15:02:14 +0100 |
---|---|---|
committer | Paweł Chmielowski <pchmielowski@process-one.net> | 2020-02-18 15:02:23 +0100 |
commit | a19fdb717bc320a41092195a97bbd2281ae2472e (patch) | |
tree | d918a1e2fb4cfdb8387a14964c11b50d86fa663d /src/ejabberd_piefxis.erl | |
parent | Update 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.erl | 25 |
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 |