diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/sqfshelper/data_reader.c | 65 | 
1 files changed, 36 insertions, 29 deletions
| diff --git a/lib/sqfshelper/data_reader.c b/lib/sqfshelper/data_reader.c index 9a31fa4..d054069 100644 --- a/lib/sqfshelper/data_reader.c +++ b/lib/sqfshelper/data_reader.c @@ -130,51 +130,58 @@ static int precache_fragment_block(data_reader_t *data, size_t idx)  	return 0;  } -data_reader_t *data_reader_create(sqfs_file_t *file, sqfs_super_t *super, +data_reader_t *data_reader_create(sqfs_file_t *file, size_t block_size,  				  sqfs_compressor_t *cmp)  { -	data_reader_t *data = alloc_flex(sizeof(*data), 1, super->block_size); -	size_t i, size; +	data_reader_t *data = alloc_flex(sizeof(*data), 1, block_size); + +	if (data != NULL) { +		data->file = file; +		data->block_size = block_size; +		data->cmp = cmp; +	} + +	return data; +} + +int data_reader_load_fragment_table(data_reader_t *data, +				    const sqfs_super_t *super) +{  	void *raw_frag; +	size_t size; +	uint32_t i;  	int ret; -	if (data == NULL) { -		perror("creating data reader"); -		return data; -	} +	free(data->frag_block); +	free(data->frag); -	data->num_fragments = super->fragment_entry_count; -	data->current_frag_index = super->fragment_entry_count; -	data->file = file; -	data->block_size = super->block_size; -	data->cmp = cmp; +	data->frag = NULL; +	data->frag_block = NULL; +	data->num_fragments = 0; +	data->current_frag_index = 0;  	if (super->fragment_entry_count == 0 ||  	    (super->flags & SQFS_FLAG_NO_FRAGMENTS) != 0) { -		return data; +		return 0;  	} -	if (super->fragment_table_start >= super->bytes_used) { -		fputs("Fragment table start is past end of file\n", stderr); -		free(data); -		return NULL; -	} +	if (super->fragment_table_start >= super->bytes_used) +		return SQFS_ERROR_OUT_OF_BOUNDS; -	if (SZ_MUL_OV(sizeof(data->frag[0]), data->num_fragments, &size)) { -		fputs("Too many fragments: overflow\n", stderr); -		free(data); -		return NULL; +	if (SZ_MUL_OV(sizeof(data->frag[0]), super->fragment_entry_count, +		      &size)) { +		return SQFS_ERROR_OVERFLOW;  	} -	ret = sqfs_read_table(file, cmp, size, super->fragment_table_start, +	ret = sqfs_read_table(data->file, data->cmp, size, +			      super->fragment_table_start,  			      super->directory_table_start,  			      super->fragment_table_start, &raw_frag); +	if (ret) +		return ret; -	if (ret) { -		free(data); -		return NULL; -	} - +	data->num_fragments = super->fragment_entry_count; +	data->current_frag_index = super->fragment_entry_count;  	data->frag = raw_frag;  	for (i = 0; i < data->num_fragments; ++i) { @@ -183,7 +190,7 @@ data_reader_t *data_reader_create(sqfs_file_t *file, sqfs_super_t *super,  			le64toh(data->frag[i].start_offset);  	} -	return data; +	return 0;  }  void data_reader_destroy(data_reader_t *data) | 
