diff options
Diffstat (limited to 'lib/sqfshelper')
-rw-r--r-- | lib/sqfshelper/data_writer.c | 43 |
1 files changed, 27 insertions, 16 deletions
diff --git a/lib/sqfshelper/data_writer.c b/lib/sqfshelper/data_writer.c index a545896..461cb55 100644 --- a/lib/sqfshelper/data_writer.c +++ b/lib/sqfshelper/data_writer.c @@ -111,6 +111,30 @@ static size_t deduplicate_blocks(data_writer_t *data, size_t count) return i; } +static size_t grow_fragment_table(data_writer_t *data, size_t index) +{ + size_t newsz; + void *new; + + if (index < data->max_fragments) + return 0; + + do { + newsz = data->max_fragments ? data->max_fragments * 2 : 16; + } while (index >= newsz); + + new = realloc(data->fragments, sizeof(data->fragments[0]) * newsz); + + if (new == NULL) { + perror("appending to fragment table"); + return -1; + } + + data->max_fragments = newsz; + data->fragments = new; + return 0; +} + static int block_callback(void *user, sqfs_block_t *blk) { data_writer_t *data = user; @@ -134,6 +158,9 @@ static int block_callback(void *user, sqfs_block_t *blk) offset = data->file->get_size(data->file); if (blk->flags & SQFS_BLK_FRAGMENT_BLOCK) { + if (grow_fragment_table(data, blk->index)) + return 0; + data->fragments[blk->index].start_offset = htole64(offset); data->fragments[blk->index].pad0 = 0; data->fragments[blk->index].size = htole32(out); @@ -194,24 +221,8 @@ static int block_callback(void *user, sqfs_block_t *blk) static int flush_fragment_block(data_writer_t *data) { - size_t newsz; - void *new; int ret; - if (data->num_fragments == data->max_fragments) { - newsz = data->max_fragments ? data->max_fragments * 2 : 16; - new = realloc(data->fragments, - sizeof(data->fragments[0]) * newsz); - - if (new == NULL) { - perror("appending to fragment table"); - return -1; - } - - data->max_fragments = newsz; - data->fragments = new; - } - data->frag_block->index = data->num_fragments++; ret = sqfs_block_processor_enqueue(data->proc, data->frag_block); |