From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44795) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YJlyG-0004jf-T2 for qemu-devel@nongnu.org; Fri, 06 Feb 2015 11:41:33 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YJlyF-0000pd-TR for qemu-devel@nongnu.org; Fri, 06 Feb 2015 11:41:32 -0500 Received: from mx1.redhat.com ([209.132.183.28]:39366) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YJlyF-0000pU-Cq for qemu-devel@nongnu.org; Fri, 06 Feb 2015 11:41:31 -0500 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t16GfUjx003642 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 6 Feb 2015 11:41:30 -0500 From: Kevin Wolf Date: Fri, 6 Feb 2015 17:40:36 +0100 Message-Id: <1423240849-15499-30-git-send-email-kwolf@redhat.com> In-Reply-To: <1423240849-15499-1-git-send-email-kwolf@redhat.com> References: <1423240849-15499-1-git-send-email-kwolf@redhat.com> Subject: [Qemu-devel] [PULL 29/42] block/dmg: factor out block type check List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com From: Peter Wu In preparation for adding bzip2 support, split the type check into a separate function. Make all offsets relative to the begin of a chunk such that it is easier to recognize the position without having to add up all offsets. Some comments are added to describe the fields. There is no functional change. Signed-off-by: Peter Wu Reviewed-by: John Snow Message-id: 1420566495-13284-11-git-send-email-peter@lekensteyn.nl Signed-off-by: Stefan Hajnoczi Signed-off-by: Kevin Wolf --- block/dmg.c | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/block/dmg.c b/block/dmg.c index d144a5e..cc584b5 100644 --- a/block/dmg.c +++ b/block/dmg.c @@ -192,6 +192,18 @@ typedef struct DmgHeaderState { uint32_t max_sectors_per_chunk; } DmgHeaderState; +static bool dmg_is_known_block_type(uint32_t entry_type) +{ + switch (entry_type) { + case 0x00000001: /* uncompressed */ + case 0x00000002: /* zeroes */ + case 0x80000005: /* zlib */ + return true; + default: + return false; + } +} + static int dmg_read_mish_block(BDRVDMGState *s, DmgHeaderState *ds, uint8_t *buffer, uint32_t count) { @@ -231,22 +243,19 @@ static int dmg_read_mish_block(BDRVDMGState *s, DmgHeaderState *ds, for (i = s->n_chunks; i < s->n_chunks + chunk_count; i++) { s->types[i] = buff_read_uint32(buffer, offset); - offset += 4; - if (s->types[i] != 0x80000005 && s->types[i] != 1 && - s->types[i] != 2) { + if (!dmg_is_known_block_type(s->types[i])) { chunk_count--; i--; - offset += 36; + offset += 40; continue; } - offset += 4; - s->sectors[i] = buff_read_uint64(buffer, offset); + /* sector number */ + s->sectors[i] = buff_read_uint64(buffer, offset + 8); s->sectors[i] += out_offset; - offset += 8; - s->sectorcounts[i] = buff_read_uint64(buffer, offset); - offset += 8; + /* sector count */ + s->sectorcounts[i] = buff_read_uint64(buffer, offset + 0x10); if (s->sectorcounts[i] > DMG_SECTORCOUNTS_MAX) { error_report("sector count %" PRIu64 " for chunk %" PRIu32 @@ -256,12 +265,12 @@ static int dmg_read_mish_block(BDRVDMGState *s, DmgHeaderState *ds, goto fail; } - s->offsets[i] = buff_read_uint64(buffer, offset); + /* offset in (compressed) data fork */ + s->offsets[i] = buff_read_uint64(buffer, offset + 0x18); s->offsets[i] += in_offset; - offset += 8; - s->lengths[i] = buff_read_uint64(buffer, offset); - offset += 8; + /* length in (compressed) data fork */ + s->lengths[i] = buff_read_uint64(buffer, offset + 0x20); if (s->lengths[i] > DMG_LENGTHS_MAX) { error_report("length %" PRIu64 " for chunk %" PRIu32 @@ -273,6 +282,7 @@ static int dmg_read_mish_block(BDRVDMGState *s, DmgHeaderState *ds, update_max_chunk_size(s, i, &ds->max_compressed_size, &ds->max_sectors_per_chunk); + offset += 40; } s->n_chunks += chunk_count; return 0; -- 1.8.3.1