From 9dcb13bf2787bc5249b2499d72e2ddbffad96373 Mon Sep 17 00:00:00 2001 From: Magnus Ahltorp Date: Tue, 22 Nov 2016 14:08:14 +0100 Subject: listpermdb: support 64-bit commit length field Better error handling --- test/listpermdb.erl | 53 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 10 deletions(-) (limited to 'test') diff --git a/test/listpermdb.erl b/test/listpermdb.erl index 4000971..526ca98 100755 --- a/test/listpermdb.erl +++ b/test/listpermdb.erl @@ -9,7 +9,7 @@ -define(DATA_COMMIT_START_COOKIE, 16#75c2e4b3d5f643a1). -define(DATA_COMMIT_END_COOKIE, 16#2b05eed61b5af550). -define(INDEX_COMMIT_END_COOKIE, 16#2fb1778c74a402e4). --define(DATA_FILE_COOKIE, 16#d53551ba539a4252). +-define(DATA_FILE_COOKIE, 16#99c99d588b1e7983). -define(INDEX_FILE_COOKIE, 16#b7e16b02ba8a6d1b). -define(DATA_ENTRY_COOKIE, 16#e7c1cdc2ba3dc77c). -define(INDEX_NODE_COOKIE, 16#2e0f555ad73210d1). @@ -100,12 +100,20 @@ printindex(<>, FileOffset) -> error. printdata(<<>>, FileOffset) -> + io:format("reached end of file~n", []), {ok, FileOffset}; printdata(<>, FileOffset) -> FileOffset2 = FileOffset + 8 + 32 + 4, io:format("data ~p key ~p length ~p~n", [FileOffset, Key, Length]), - <> = Rest, - printdata(Rest2, FileOffset2 + Length); + case Rest of + <> -> + printdata(Rest2, FileOffset2 + Length); + _ -> + io:format("data was truncated, remaining bytes: ~p ~p~n", + [size(Rest), + binary:part(Rest, 0, min(size(Rest), 16))]), + error + end; printdata(<> = Rest, FileOffset) -> Padding = case FileOffset rem 4 of 0 -> @@ -118,16 +126,41 @@ printdata(<> = Rest, FileOffset) -> 1 end, io:format("printdata: ~p ~p~n", [Padding, FileOffset]), - <<0:Padding/unit:8, CommitLength:32, CommitChecksum:32/binary, ?DATA_COMMIT_END_COOKIE:64, Rest3/binary>> = Rest2, - {{CommitLength, CommitChecksum, Rest3}, FileOffset + 8 + Padding + 4, FileOffset + 8 + Padding + 4 + 32 + 8}; -printdata(<>, FileOffset) -> - io:format("unknown byte: ~p at ~p~n", [Unknown, FileOffset]), - error. + case Rest2 of + <<0:Padding/unit:8, + CommitLength:64, + CommitChecksum:32/binary, + ?DATA_COMMIT_END_COOKIE:64, + Rest3/binary>> -> + {{CommitLength, CommitChecksum, Rest3}, + FileOffset + 8 + Padding + 8, FileOffset + + 8 + Padding + 8 + 32 + 8}; + _ -> + io:format("commit trailer was not correctly formed at ~p, " + ++ "expected padding ~p, remaining bytes: ~p ~w~n", + [FileOffset, Padding, size(Rest), + binary:part(Rest, 0, min(size(Rest), 64))]), + error + end; +printdata(Data, FileOffset) -> + Unknown = binary:part(Data, 0, min(size(Data), 16)), + io:format("unknown byte: ~p at ~p~n", [Unknown, FileOffset]), + error. + +read_whole_file(File, Size) -> + case file:read(File, Size) of + {ok, Data} -> + RestData = read_whole_file(File, Size), + <>; + eof -> + <<>> + end. main([Filename]) -> {ok, FileInfo} = file:read_file_info(Filename), File = openfile(Filename), - {ok, Data} = file:read(File, FileInfo#file_info.size), - io:format("read ~p bytes~n", [size(Data)]), + Data = read_whole_file(File, FileInfo#file_info.size), + io:format("read ~p bytes, file size ~p~n", + [size(Data), FileInfo#file_info.size]), ok = printfile(Data), ok. -- cgit v1.1