From 950f4d948367f21d2948e9eb9c50cf3ff0e11877 Mon Sep 17 00:00:00 2001 From: Andrew Mayorov Date: Wed, 3 Jul 2024 15:18:54 +0200 Subject: [PATCH] fix(sessds): defend restartable stream iterator from infinite loop --- .../emqx_persistent_session_ds_stream_scheduler.erl | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/emqx/src/emqx_persistent_session_ds/emqx_persistent_session_ds_stream_scheduler.erl b/apps/emqx/src/emqx_persistent_session_ds/emqx_persistent_session_ds_stream_scheduler.erl index 9b1f15aa4..80dee0e4d 100644 --- a/apps/emqx/src/emqx_persistent_session_ds/emqx_persistent_session_ds_stream_scheduler.erl +++ b/apps/emqx/src/emqx_persistent_session_ds/emqx_persistent_session_ds_stream_scheduler.erl @@ -136,10 +136,13 @@ next_stream(ItStream0 = #iter{limit = N, filter = Filter, it = It0, it_cont = It false -> next_stream(ItStream) end; - none -> + none when It0 =/= ItCont -> %% Restart the iteration from the beginning: ItStream = ItStream0#iter{it = ItCont}, - next_stream(ItStream) + next_stream(ItStream); + none -> + %% No point in restarting the iteration, `ItCont` is empty: + none end. is_fetchable(_Comm1, _Comm2, #srs{it_end = end_of_stream}) ->