summaryrefslogtreecommitdiffstats
path: root/lang/erlang14/files
diff options
context:
space:
mode:
authorolgeni <olgeni@FreeBSD.org>2003-12-27 18:57:37 +0000
committerolgeni <olgeni@FreeBSD.org>2003-12-27 18:57:37 +0000
commit393f1cf9deecb96615ac34dce8c6fec8e8d6e04a (patch)
treeef1635604e2d2e7d5b5ae8e0718b98a4eb52d085 /lang/erlang14/files
parent266a1a468602da56cc0b52c672c77a33c17f42ac (diff)
downloadFreeBSD-ports-393f1cf9deecb96615ac34dce8c6fec8e8d6e04a.zip
FreeBSD-ports-393f1cf9deecb96615ac34dce8c6fec8e8d6e04a.tar.gz
Fix dets file corruption issue.
Obtained from: Hans Bolinder <hasse@erix.ericsson.se>
Diffstat (limited to 'lang/erlang14/files')
-rw-r--r--lang/erlang14/files/patch-lib_stdlib_src_dets__v9.erl77
1 files changed, 77 insertions, 0 deletions
diff --git a/lang/erlang14/files/patch-lib_stdlib_src_dets__v9.erl b/lang/erlang14/files/patch-lib_stdlib_src_dets__v9.erl
new file mode 100644
index 0000000..fefd4c9
--- /dev/null
+++ b/lang/erlang14/files/patch-lib_stdlib_src_dets__v9.erl
@@ -0,0 +1,77 @@
+
+$FreeBSD$
+
+--- lib/stdlib/src/dets_v9.erl.orig Mon Jul 7 14:17:44 2003
++++ lib/stdlib/src/dets_v9.erl Fri Dec 26 14:58:33 2003
+@@ -212,7 +212,6 @@
+ -define(FREELIST_POS, 0).
+ -define(CLOSED_PROPERLY_POS, 8).
+ -define(D_POS, 20).
+--define(NO_KEYS_POS, (?D_POS + 16)).
+
+ %%% Dets file versions up to 8 are handled in dets_v8. This module
+ %%% handles version 9, introduced in R8.
+@@ -416,7 +415,7 @@
+ alloc_part(Head, SegZero, PartPos),
+ {NewHead, InitSegment, [SegPointer]} =
+ alloc_seg(Head1, SegZero, SegNo, Part),
+- {NewHead, InitSegment, [SegPointer, InitArrPart, ArrPartPointer]};
++ {NewHead, InitSegment, [InitArrPart, SegPointer, ArrPartPointer]};
+ Part ->
+ alloc_seg(Head, SegZero, SegNo, Part)
+ end.
+@@ -1222,7 +1221,7 @@
+ %% Note that space for the array parts and the segments has
+ %% already been allocated, but the segments have not been
+ %% initialized on disk.
+- NoParts = no_parts(Head#head.m),
++ NoParts = no_parts(Head#head.next),
+ %% All parts first, ensured by init_segments/6.
+ Addr = ?BASE + NoParts * 4 * ?SEGPARTSZ,
+ {Head, [{?FSCK_SEGMENT,Addr,Data,0} | L]};
+@@ -1586,7 +1585,11 @@
+ {FLW, FLSize} = free_lists_to_file(H1),
+ FileSize = FreeListsPointer + FLSize + 4,
+ ok = dets_utils:write(H, [FLW | <<FileSize:32>>]),
+- NoColls = case H1#head.no_collections of
++ FileHeader = file_header(H1, FreeListsPointer, ?CLOSED_PROPERLY),
++ dets_utils:pwrite(H1, [{0, FileHeader}]).
++
++file_header(Head, FreeListsPointer, ClosedProperly) ->
++ NoColls = case Head#head.no_collections of
+ undefined -> [];
+ NC -> NC
+ end,
+@@ -1594,8 +1597,7 @@
+ NoColls,
+ lists:map(fun(X) -> {X,0} end, lists:seq(4,?MAXBUD-1))),
+ CW = lists:map(fun({_LSz,N}) -> <<N:32>> end, L),
+- FileHeader = file_header(H1, FreeListsPointer, ?CLOSED_PROPERLY, CW),
+- dets_utils:pwrite(H1, [{0, FileHeader}]).
++ file_header(Head, FreeListsPointer, ClosedProperly, CW).
+
+ file_header(Head, FreeListsPointer, ClosedProperly, NoColls) ->
+ Cookie = ?MAGIC,
+@@ -2356,17 +2358,18 @@
+ update_no_keys(Head, Ws, DeltaObjects, DeltaKeys) ->
+ NoKeys = Head#head.no_keys,
+ NewNoKeys = NoKeys + DeltaKeys,
++ NewNoObject = Head#head.no_objects + DeltaObjects,
++ NewHead = Head#head{no_objects = NewNoObject, no_keys = NewNoKeys},
+ NWs =
+ if
+- NewNoKeys > Head#head.max_no_slots ->
++ NewNoKeys > NewHead#head.max_no_slots ->
+ Ws;
+ NoKeys div ?SEGSZP == NewNoKeys div ?SEGSZP ->
+ Ws;
+ true ->
+- [{?NO_KEYS_POS, <<NewNoKeys:32>>} | Ws]
++ [{0, file_header(NewHead, 0, ?NOT_PROPERLY_CLOSED)} | Ws]
+ end,
+- NewNoObject = Head#head.no_objects + DeltaObjects,
+- {Head#head{no_objects = NewNoObject, no_keys = NewNoKeys}, NWs}.
++ {NewHead, NWs}.
+
+ slot_position(S) ->
+ SegNo = ?SLOT2SEG(S), % S div ?SEGSZP
OpenPOWER on IntegriCloud