diff options
author | Joao Marcos Costa <joaomarcos.costa@bootlin.com> | 2020-07-30 15:33:50 +0200 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2020-08-07 22:31:32 -0400 |
commit | 3634b35089df7e6edfe034c26e4243dc708b6382 (patch) | |
tree | 45135a033a314124a86afb72e699aac0892d6e7f /fs | |
parent | 81014f73f0906a70bd710ed8d7e8559e1fd8f400 (diff) |
fs/squashfs: add support for zlib decompression
Add call to zlib's 'uncompress' function. Add function to display the
right error message depending on the decompression's return value.
Signed-off-by: Joao Marcos Costa <joaomarcos.costa@bootlin.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/squashfs/sqfs_decompressor.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/fs/squashfs/sqfs_decompressor.c b/fs/squashfs/sqfs_decompressor.c index a899a5704b..09ca6cf6d0 100644 --- a/fs/squashfs/sqfs_decompressor.c +++ b/fs/squashfs/sqfs_decompressor.c @@ -9,17 +9,47 @@ #include <stdint.h> #include <stdio.h> #include <stdlib.h> +#if IS_ENABLED(CONFIG_ZLIB) +#include <u-boot/zlib.h> +#endif #include "sqfs_decompressor.h" #include "sqfs_filesystem.h" #include "sqfs_utils.h" +#if IS_ENABLED(CONFIG_ZLIB) +static void zlib_decompression_status(int ret) +{ + switch (ret) { + case Z_BUF_ERROR: + printf("Error: 'dest' buffer is not large enough.\n"); + break; + case Z_DATA_ERROR: + printf("Error: corrupted compressed data.\n"); + break; + case Z_MEM_ERROR: + printf("Error: insufficient memory.\n"); + break; + } +} +#endif + int sqfs_decompress(u16 comp_type, void *dest, unsigned long *dest_len, void *source, u32 lenp) { int ret = 0; switch (comp_type) { +#if IS_ENABLED(CONFIG_ZLIB) + case SQFS_COMP_ZLIB: + ret = uncompress(dest, dest_len, source, lenp); + if (ret) { + zlib_decompression_status(ret); + return -EINVAL; + } + + break; +#endif default: printf("Error: unknown compression type.\n"); return -EINVAL; |