From 296abb23bb425831b57a767bfc574ea61604301b Mon Sep 17 00:00:00 2001 From: Ulf Wiger Date: Fri, 22 Jul 2022 16:33:32 +0200 Subject: [PATCH] Fix double encoding of info data --- src/mnesia_rocksdb_admin.erl | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/mnesia_rocksdb_admin.erl b/src/mnesia_rocksdb_admin.erl index 1bb6421..5c1cd43 100644 --- a/src/mnesia_rocksdb_admin.erl +++ b/src/mnesia_rocksdb_admin.erl @@ -280,9 +280,12 @@ write_info(Alias, Tab, K, V) -> write_info_(get_ref({admin, Alias}), Tab, K, V). write_info_(Ref, Tab, K, V) -> + write_info_encv(Ref, Tab, K, term_to_binary(V)). + +write_info_encv(Ref, Tab, K, V) -> EncK = mnesia_rocksdb_lib:encode_key({info,Tab,K}, sext), maybe_write_standalone_info(Ref, K, V), - mrdb:rdb_put(Ref, EncK, term_to_binary(V), []). + mrdb:rdb_put(Ref, EncK, V, []). maybe_write_standalone_info(Ref, K, V) -> case Ref of @@ -1228,7 +1231,18 @@ load_info_(Res, I, ARef, Tab) -> DecK = mnesia_rocksdb_lib:decode_key(K), case read_info_(ARef, Tab, DecK, undefined) of undefined -> - write_info_(ARef, Tab, DecK, V); + write_info_encv(ARef, Tab, DecK, V); + <<131,_/binary>> = Value -> + %% Due to a previous bug, info values could be double-encoded with binary_to_term() + try binary_to_term(Value) of + _DecVal -> + %% We haven't been storing erlang-term encoded data as info, + %% so assume this is double-encoded and correct + write_info_encv(ARef, Tab, DecK, Value) + catch + error:_ -> + skip + end; _ -> skip end,