diff --git a/deps/rabbit/src/rabbit_msg_store.erl b/deps/rabbit/src/rabbit_msg_store.erl index ea5e55be4c..f706f2f243 100644 --- a/deps/rabbit/src/rabbit_msg_store.erl +++ b/deps/rabbit/src/rabbit_msg_store.erl @@ -1599,7 +1599,7 @@ scan_data(<> = Data, Fd, Fun, Offset, FileSiz end; %% This might be the start of a message. scan_data(<> = Data, Fd, Fun, Offset, FileSize, MsgIdsFound, Acc) - when byte_size(Rest) < Size + 1, Size < FileSize - Offset -> + when byte_size(Rest) < Size + 1, Size + 9 =< FileSize - Offset -> scan(Data, Fd, Fun, Offset, FileSize, MsgIdsFound, Acc); scan_data(Data, Fd, Fun, Offset, FileSize, MsgIdsFound, Acc) when byte_size(Data) < 8 -> diff --git a/deps/rabbit/test/backing_queue_SUITE.erl b/deps/rabbit/test/backing_queue_SUITE.erl index d7a7c526b4..01ff9f5aa2 100644 --- a/deps/rabbit/test/backing_queue_SUITE.erl +++ b/deps/rabbit/test/backing_queue_SUITE.erl @@ -710,6 +710,17 @@ msg_store_file_scan1(Config) -> [{bin, <<0, 0:48, 17, 17, "idididididididid", 255, 0:4352/unit:8, 255>>}], {ok, [{<<"idididididididid">>, 4378, 1}]}, fun(Obj = {<<"idididididididid">>, 4378, 1}) -> {valid, Obj}; (_) -> invalid end), + %% Off-by-nine regression testing. The file scanning could miss + %% some messages if previous data looked like a message but its + %% size went past the end of the file. + lists:foreach(fun(N) -> + ok = Scan([ + {bin, <<(4194304 + N):64, 0:(4194304 - 8 - 25 - 10)/unit:8>>}, + {msg, gen_id(), <<>>}, + %% Padding ensures there's no 255 at the end of the size indicated by 'bin'. + {pad, 10} + ]) + end, lists:seq(-9, -1)), %% All good!! passed.