cbfstool: have decompress functions provide ouput data size
Currently cbfs stage files that are compressed do not have the decompressed size readily available. Therefore there's no good way to know actual size of data after it is decompressed. Optionally return the decompressed data size if requested. Change-Id: If371753d28d0ff512118d8bc06fdd48f4a0aeae7 Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: http://review.coreboot.org/12173 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi <pgeorgi@google.com>
This commit is contained in:
parent
cd9ba8ac03
commit
5213c53f6f
|
@ -692,7 +692,7 @@ int cbfs_export_entry(struct cbfs_image *image, const char *entry_name,
|
||||||
buffer.data = malloc(decompressed_size);
|
buffer.data = malloc(decompressed_size);
|
||||||
buffer.size = decompressed_size;
|
buffer.size = decompressed_size;
|
||||||
if (decompress(CBFS_SUBHEADER(entry), ntohl(entry->len),
|
if (decompress(CBFS_SUBHEADER(entry), ntohl(entry->len),
|
||||||
buffer.data, buffer.size)) {
|
buffer.data, buffer.size, NULL)) {
|
||||||
ERROR("decompression failed for %s\n", entry_name);
|
ERROR("decompression failed for %s\n", entry_name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -153,7 +153,8 @@ typedef int (*comp_func_ptr) (char *in, int in_len, char *out, int *out_len);
|
||||||
* Returns 0 on error,
|
* Returns 0 on error,
|
||||||
* != 0 otherwise, depending on the decompressing function.
|
* != 0 otherwise, depending on the decompressing function.
|
||||||
*/
|
*/
|
||||||
typedef int (*decomp_func_ptr) (char *in, int in_len, char *out, int out_len);
|
typedef int (*decomp_func_ptr) (char *in, int in_len, char *out, int out_len,
|
||||||
|
size_t *actual_size);
|
||||||
|
|
||||||
enum comp_algo { CBFS_COMPRESS_NONE = 0, CBFS_COMPRESS_LZMA = 1 };
|
enum comp_algo { CBFS_COMPRESS_NONE = 0, CBFS_COMPRESS_LZMA = 1 };
|
||||||
|
|
||||||
|
@ -187,7 +188,8 @@ void print_supported_filetypes(void);
|
||||||
|
|
||||||
/* lzma/lzma.c */
|
/* lzma/lzma.c */
|
||||||
int do_lzma_compress(char *in, int in_len, char *out, int *out_len);
|
int do_lzma_compress(char *in, int in_len, char *out, int *out_len);
|
||||||
int do_lzma_uncompress(char *dst, int dst_len, char *src, int src_len);
|
int do_lzma_uncompress(char *dst, int dst_len, char *src, int src_len,
|
||||||
|
size_t *actual_size);
|
||||||
|
|
||||||
/* xdr.c */
|
/* xdr.c */
|
||||||
struct xdr {
|
struct xdr {
|
||||||
|
|
|
@ -31,9 +31,10 @@ static int lzma_compress(char *in, int in_len, char *out, int *out_len)
|
||||||
return do_lzma_compress(in, in_len, out, out_len);
|
return do_lzma_compress(in, in_len, out, out_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int lzma_decompress(char *in, int in_len, char *out, unused int out_len)
|
static int lzma_decompress(char *in, int in_len, char *out, unused int out_len,
|
||||||
|
size_t *actual_size)
|
||||||
{
|
{
|
||||||
return do_lzma_uncompress(out, out_len, in, in_len);
|
return do_lzma_uncompress(out, out_len, in, in_len, actual_size);
|
||||||
}
|
}
|
||||||
static int none_compress(char *in, int in_len, char *out, int *out_len)
|
static int none_compress(char *in, int in_len, char *out, int *out_len)
|
||||||
{
|
{
|
||||||
|
@ -42,9 +43,12 @@ static int none_compress(char *in, int in_len, char *out, int *out_len)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int none_decompress(char *in, int in_len, char *out, unused int out_len)
|
static int none_decompress(char *in, int in_len, char *out, unused int out_len,
|
||||||
|
size_t *actual_size)
|
||||||
{
|
{
|
||||||
memcpy(out, in, in_len);
|
memcpy(out, in, in_len);
|
||||||
|
if (actual_size != NULL)
|
||||||
|
*actual_size = in_len;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -152,7 +152,8 @@ int do_lzma_compress(char *in, int in_len, char *out, int *out_len)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int do_lzma_uncompress(char *dst, int dst_len, char *src, int src_len)
|
int do_lzma_uncompress(char *dst, int dst_len, char *src, int src_len,
|
||||||
|
size_t *actual_size)
|
||||||
{
|
{
|
||||||
if (src_len <= LZMA_PROPS_SIZE + 8) {
|
if (src_len <= LZMA_PROPS_SIZE + 8) {
|
||||||
ERROR("LZMA: Input length is too small.\n");
|
ERROR("LZMA: Input length is too small.\n");
|
||||||
|
@ -184,5 +185,8 @@ int do_lzma_uncompress(char *dst, int dst_len, char *src, int src_len)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (actual_size != NULL)
|
||||||
|
*actual_size = destlen;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue