From 829d3a5189ac50bd5893b38bf4c8cd3055c26083 Mon Sep 17 00:00:00 2001 From: Elliot Nunn Date: Sun, 14 Oct 2018 10:08:44 +0800 Subject: [PATCH] Pad B*-tree files to the alloc block size This bug was corrupting all volumes over 32 MB (i.e. with a block size exceeding 512 bytes). Oops! --- machfs/btree.py | 9 +++++++-- machfs/main.py | 4 ++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/machfs/btree.py b/machfs/btree.py index 164c311..c3b8429 100644 --- a/machfs/btree.py +++ b/machfs/btree.py @@ -103,7 +103,9 @@ def dump_btree(buf): this_leaf = ndFLink -def make_btree(records, bthKeyLen): +def make_btree(records, bthKeyLen, blksize): + nodemult = blksize // 512 + nodelist = [] # append to this as we go # pointers per index node, range 2-11 @@ -156,7 +158,7 @@ def make_btree(records, bthKeyLen): # Add map nodes with 3952-bit bitmap recs to cover every node bits_covered = 2048 mapnodes = [] - while bits_covered < len(nodelist): + while bits_covered < bitmanip.pad_up(len(nodelist), nodemult): mapnode = _Node(ndType=2, ndNHeight=1) nodelist.append(mapnode) mapnodes.append(mapnode) @@ -188,4 +190,7 @@ def make_btree(records, bthKeyLen): bthDepth, bthRoot, bthNRecs, bthFNode, bthLNode, bthNodeSize, bthKeyLen, bthNNodes, bthFree) + slop_nodes = bitmanip.pad_up(len(nodelist), nodemult) - len(nodelist) + nodelist.append(512 * slop_nodes) + return b''.join(bytes(node) for node in nodelist) diff --git a/machfs/main.py b/machfs/main.py index 0d9eff2..4fcb5d4 100644 --- a/machfs/main.py +++ b/machfs/main.py @@ -243,7 +243,7 @@ class Volume(directory.AbstractFolder): blkaccum = [] # <<< put the empty extents overflow file in here >>> - extoflowfile = btree.make_btree([], bthKeyLen=7) + extoflowfile = btree.make_btree([], bthKeyLen=7, blksize=drAlBlkSiz) # also need to do some cleverness to ensure that this gets picked up... drXTFlSize = len(extoflowfile) drXTExtRec_Start = len(blkaccum) @@ -344,7 +344,7 @@ class Volume(directory.AbstractFolder): # now it is time to sort these records! fuck that shit... catalog.sort(key=_catalog_rec_sort) - catalogfile = btree.make_btree(catalog, bthKeyLen=37) + catalogfile = btree.make_btree(catalog, bthKeyLen=37, blksize=drAlBlkSiz) # also need to do some cleverness to ensure that this gets picked up... drCTFlSize = len(catalogfile) drCTExtRec_Start = len(blkaccum)