From 9cd048c442b0183280730945eb19c3e850a7c21e Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Wed, 13 Jan 2016 23:01:51 +0100 Subject: [PATCH] mod_mam: Improve binary comparison of message UIDs Make sure the binary comparison performed when clients use message UIDs to page through Mnesia archives yields correct results even if the specified UIDs don't have the same number of digits as the UIDs of the stored messages. This way, MAM will continue to work as expected after migrating from mod_mam_mnesia to mod_mam. --- src/mod_mam.erl | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/mod_mam.erl b/src/mod_mam.erl index 1398cf1be..1bcf1b0dc 100644 --- a/src/mod_mam.erl +++ b/src/mod_mam.erl @@ -44,6 +44,13 @@ -include("mod_muc_room.hrl"). -include("ejabberd_commands.hrl"). +-define(BIN_GREATER_THAN(A, B), + ((A > B andalso byte_size(A) == byte_size(B)) + orelse byte_size(A) > byte_size(B))). +-define(BIN_LESS_THAN(A, B), + ((A < B andalso byte_size(A) == byte_size(B)) + orelse byte_size(A) < byte_size(B))). + -record(archive_msg, {us = {<<"">>, <<"">>} :: {binary(), binary()} | '$2', id = <<>> :: binary() | '_', @@ -1014,11 +1021,12 @@ filter_by_rsm(Msgs, #rsm_in{max = Max, direction = Direction, id = ID}) -> aft when ID /= <<"">> -> lists:filter( fun(#archive_msg{id = I}) -> - I > ID + ?BIN_GREATER_THAN(I, ID) end, Msgs); before when ID /= <<"">> -> lists:foldl( - fun(#archive_msg{id = I} = Msg, Acc) when I < ID -> + fun(#archive_msg{id = I} = Msg, Acc) + when ?BIN_LESS_THAN(I, ID) -> [Msg|Acc]; (_, Acc) -> Acc