summaryrefslogtreecommitdiff
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
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>
-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);