From c924d87a4cbbeb93825f34f997add1ca4573a368 Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Sun, 23 Feb 2020 03:44:33 +0100 Subject: Unify the payload counters in the sqfs_inode_generic_t Instead of having seperate counters for blocks, dir index bytes and having to fiddle out the link target size, simply use a single value that stores the number of payload bytes used. A seperate "payload bytes available" is used for dynamically growing inodes during processing. Signed-off-by: David Oberhollenzer --- lib/sqfs/write_inode.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) (limited to 'lib/sqfs/write_inode.c') diff --git a/lib/sqfs/write_inode.c b/lib/sqfs/write_inode.c index b5ba905..86ed146 100644 --- a/lib/sqfs/write_inode.c +++ b/lib/sqfs/write_inode.c @@ -14,18 +14,26 @@ #include "compat.h" #include +#include static int write_block_sizes(sqfs_meta_writer_t *ir, const sqfs_inode_generic_t *n) { - sqfs_u32 sizes[n->num_file_blocks]; + sqfs_u32 *sizes; size_t i; - for (i = 0; i < n->num_file_blocks; ++i) + if (n->payload_bytes_used < sizeof(sizes[0])) + return 0; + + if ((n->payload_bytes_used % sizeof(sizes[0])) != 0) + return SQFS_ERROR_CORRUPTED; + + sizes = alloca(n->payload_bytes_used); + + for (i = 0; i < (n->payload_bytes_used / sizeof(sizes[0])); ++i) sizes[i] = htole32(n->extra[i]); - return sqfs_meta_writer_append(ir, sizes, - sizeof(sqfs_u32) * n->num_file_blocks); + return sqfs_meta_writer_append(ir, sizes, n->payload_bytes_used); } static int write_dir_index(sqfs_meta_writer_t *ir, const sqfs_u8 *data, @@ -102,7 +110,7 @@ int sqfs_meta_writer_write_inode(sqfs_meta_writer_t *ir, ret = sqfs_meta_writer_append(ir, &file, sizeof(file)); if (ret) return ret; - return n->num_file_blocks ? write_block_sizes(ir, n) : 0; + return write_block_sizes(ir, n); } case SQFS_INODE_SLINK: { sqfs_inode_slink_t slink = { @@ -144,7 +152,7 @@ int sqfs_meta_writer_write_inode(sqfs_meta_writer_t *ir, if (ret) return ret; return write_dir_index(ir, (const sqfs_u8 *)n->extra, - n->num_dir_idx_bytes); + n->payload_bytes_used); } case SQFS_INODE_EXT_FILE: { sqfs_inode_file_ext_t file = { @@ -160,7 +168,7 @@ int sqfs_meta_writer_write_inode(sqfs_meta_writer_t *ir, ret = sqfs_meta_writer_append(ir, &file, sizeof(file)); if (ret) return ret; - return n->num_file_blocks ? write_block_sizes(ir, n) : 0; + return write_block_sizes(ir, n); } case SQFS_INODE_EXT_SLINK: { sqfs_inode_slink_t slink = { -- cgit v1.2.3