Am 10.08.2018 um 06:07 hat Julio Faracco geschrieben:
> This commit includes the support to new module dmg-lzfse into dmg block
> driver. It includes the support for block type ULFO (0x80000007).
> 
> Signed-off-by: Julio Faracco <jcfara...@gmail.com>
> ---
>  block/dmg.c | 28 ++++++++++++++++++++++++++++
>  block/dmg.h |  3 +++
>  2 files changed, 31 insertions(+)
> 
> diff --git a/block/dmg.c b/block/dmg.c
> index c9b3c519c4..390ab67e53 100644
> --- a/block/dmg.c
> +++ b/block/dmg.c
> @@ -33,6 +33,9 @@
>  int (*dmg_uncompress_bz2)(char *next_in, unsigned int avail_in,
>                            char *next_out, unsigned int avail_out);
>  
> +int (*dmg_uncompress_lzfse)(char *next_in, unsigned int avail_in,
> +                            char *next_out, unsigned int avail_out);
> +
>  enum {
>      /* Limit chunk sizes to prevent unreasonable amounts of memory being used
>       * or truncating when converting to 32-bit types
> @@ -107,6 +110,7 @@ static void update_max_chunk_size(BDRVDMGState *s, 
> uint32_t chunk,
>      switch (s->types[chunk]) {
>      case 0x80000005: /* zlib compressed */
>      case 0x80000006: /* bzip2 compressed */
> +    case 0x80000007: /* lzfse compressed */
>          compressed_size = s->lengths[chunk];
>          uncompressed_sectors = s->sectorcounts[chunk];
>          break;
> @@ -188,6 +192,8 @@ static bool dmg_is_known_block_type(uint32_t entry_type)
>          return true;
>      case 0x80000006:    /* bzip2 */
>          return !!dmg_uncompress_bz2;
> +    case 0x80000007:    /* lzfse */
> +     return !!dmg_uncompress_lzfse;

Indentation is off. I think you got a tab instead of spaces here.

>      default:
>          return false;
>      }
> @@ -431,6 +437,7 @@ static int dmg_open(BlockDriverState *bs, QDict *options, 
> int flags,
>      }
>  
>      block_module_load_one("dmg-bz2");
> +    block_module_load_one("dmg-lzfse");
>  
>      s->n_chunks = 0;
>      s->offsets = s->lengths = s->sectors = s->sectorcounts = NULL;
> @@ -629,6 +636,27 @@ static inline int dmg_read_chunk(BlockDriverState *bs, 
> uint64_t sector_num)
>                  return ret;
>              }
>              break;
> +     case 0x80000007:
> +         if (!dmg_uncompress_lzfse) {

More tab damage in these two lines.

> +                break;
> +            }
> +            /* we need to buffer, because only the chunk as whole can be
> +             * inflated. */
> +            ret = bdrv_pread(bs->file, s->offsets[chunk],
> +                             s->compressed_chunk, s->lengths[chunk]);
> +            if (ret != s->lengths[chunk]) {
> +                return -1;
> +            }
> +
> +            ret = dmg_uncompress_lzfse((char *)s->compressed_chunk,
> +                                       (unsigned int) s->lengths[chunk],
> +                                       (char *)s->uncompressed_chunk,
> +                                       (unsigned int)
> +                                           (512 * s->sectorcounts[chunk]));
> +            if (ret < 0) {

lzfse_decode_buffer() returns 0 in error cases, and possibly a short
number of bytes. Should the condition compare ret with the expected full
byte count?

> +                return ret;
> +            }
> +            break;
>          case 1: /* copy */
>              ret = bdrv_pread(bs->file, s->offsets[chunk],
>                               s->uncompressed_chunk, s->lengths[chunk]);

Kevin

Reply via email to