summaryrefslogtreecommitdiff
path: root/mkfs/meta.c
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2019-05-19 14:22:10 +0200
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2019-05-19 14:27:34 +0200
commit087bdaa6f4c597626cc547b59b7764405f16c4a2 (patch)
treeb1a7ab2e331c1dc1d8aea281c067980368d25a4f /mkfs/meta.c
parent6e4768e67394566cbacdb5338dd776781277ff00 (diff)
Fix directory index (yet again)
Turns out (after countless hours of debugging since the squashfs kernel code is so convoluted) that the offset is relative to the first directory header for no apparant reason (the field holding the offset is way larger than neccessary to store absolute values). Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'mkfs/meta.c')
-rw-r--r--mkfs/meta.c30
1 files changed, 13 insertions, 17 deletions
diff --git a/mkfs/meta.c b/mkfs/meta.c
index 7ee5dd4..0e8dad5 100644
--- a/mkfs/meta.c
+++ b/mkfs/meta.c
@@ -74,7 +74,7 @@ static int write_dir(meta_writer_t *dm, dir_info_t *dir, dir_index_t **index)
while (c != NULL) {
count = 0;
- size = dm->offset;
+ size = (dm->offset + sizeof(hdr)) % SQFS_META_BLOCK_SIZE;
for (d = c; d != NULL; d = d->next) {
if ((d->inode_ref >> 16) != (c->inode_ref >> 16))
@@ -84,13 +84,8 @@ static int write_dir(meta_writer_t *dm, dir_info_t *dir, dir_index_t **index)
size += sizeof(ent) + strlen(c->name);
- if (size > SQFS_META_BLOCK_SIZE) {
- if (count > 0) {
- break;
- } else {
- size %= SQFS_META_BLOCK_SIZE;
- }
- }
+ if (count > 0 && size > SQFS_META_BLOCK_SIZE)
+ break;
count += 1;
}
@@ -98,15 +93,13 @@ static int write_dir(meta_writer_t *dm, dir_info_t *dir, dir_index_t **index)
if (count > SQFS_MAX_DIR_ENT)
count = SQFS_MAX_DIR_ENT;
- if (index != NULL) {
- if (dir_index_grow(index))
- return -1;
+ if (dir_index_grow(index))
+ return -1;
- i = (*index)->num_nodes++;
- (*index)->idx_nodes[i].node = c;
- (*index)->idx_nodes[i].block = dm->block_offset;
- (*index)->idx_nodes[i].offset = dm->offset;
- }
+ i = (*index)->num_nodes++;
+ (*index)->idx_nodes[i].node = c;
+ (*index)->idx_nodes[i].block = dm->block_offset;
+ (*index)->idx_nodes[i].offset = dm->offset;
hdr.count = htole32(count - 1);
hdr.start_block = htole32(c->inode_ref >> 16);
@@ -294,9 +287,12 @@ static int write_inode(sqfs_info_t *info, meta_writer_t *im, meta_writer_t *dm,
}
for (i = 0; i < diridx->num_nodes; ++i) {
- idx.index = htole32(diridx->idx_nodes[i].offset);
idx.start_block = htole32(diridx->idx_nodes[i].block);
+ idx.index = diridx->idx_nodes[i].offset;
+ idx.index -= node->data.dir->block_offset;
+ idx.index = htole32(idx.index);
+
idx.size = strlen(diridx->idx_nodes[i].node->name) - 1;
idx.size = htole32(idx.size);