sparse: Move main header parsing to a function of its own
authorMaxime Ripard <maxime.ripard@free-electrons.com>
Thu, 15 Oct 2015 12:34:10 +0000 (14:34 +0200)
committerTom Rini <trini@konsulko.com>
Thu, 12 Nov 2015 18:17:28 +0000 (13:17 -0500)
The current sparse image format parser is quite tangled, with a lot of
code duplication.

Start refactoring it by moving the header parsing function to a function
of its own.

Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Reviewed-by: Tom Rini <trini@konsulko.com>
common/aboot.c

index fba8e3e683e7da654cb1aaf61bd92f4224a29f0f..cd1b6a6ac8e000c7d3884143d0b05363e020e20e 100644 (file)
 #include <part.h>
 #include <sparse_format.h>
 
+static sparse_header_t *sparse_parse_header(void **data)
+{
+       /* Read and skip over sparse image header */
+       sparse_header_t *sparse_header = (sparse_header_t *) *data;
+
+       *data += sparse_header->file_hdr_sz;
+
+       debug("=== Sparse Image Header ===\n");
+       debug("magic: 0x%x\n", sparse_header->magic);
+       debug("major_version: 0x%x\n", sparse_header->major_version);
+       debug("minor_version: 0x%x\n", sparse_header->minor_version);
+       debug("file_hdr_sz: %d\n", sparse_header->file_hdr_sz);
+       debug("chunk_hdr_sz: %d\n", sparse_header->chunk_hdr_sz);
+       debug("blk_sz: %d\n", sparse_header->blk_sz);
+       debug("total_blks: %d\n", sparse_header->total_blks);
+       debug("total_chunks: %d\n", sparse_header->total_chunks);
+
+       return sparse_header;
+}
+
 void write_sparse_image(block_dev_desc_t *dev_desc,
                disk_partition_t *info, const char *part_name,
                void *data, unsigned sz)
@@ -58,29 +78,12 @@ void write_sparse_image(block_dev_desc_t *dev_desc,
        uint32_t total_blocks = 0;
        int i;
 
-       /* Read and skip over sparse image header */
-       sparse_header = (sparse_header_t *) data;
-
-       data += sparse_header->file_hdr_sz;
-       if (sparse_header->file_hdr_sz > sizeof(sparse_header_t))
-       {
-               /*
-                * Skip the remaining bytes in a header that is longer than
-                * we expected.
-                */
-               data += (sparse_header->file_hdr_sz - sizeof(sparse_header_t));
+       sparse_header = sparse_parse_header(&data);
+       if (!sparse_header) {
+               fastboot_fail("sparse header issue\n");
+               return;
        }
 
-       debug("=== Sparse Image Header ===\n");
-       debug("magic: 0x%x\n", sparse_header->magic);
-       debug("major_version: 0x%x\n", sparse_header->major_version);
-       debug("minor_version: 0x%x\n", sparse_header->minor_version);
-       debug("file_hdr_sz: %d\n", sparse_header->file_hdr_sz);
-       debug("chunk_hdr_sz: %d\n", sparse_header->chunk_hdr_sz);
-       debug("blk_sz: %d\n", sparse_header->blk_sz);
-       debug("total_blks: %d\n", sparse_header->total_blks);
-       debug("total_chunks: %d\n", sparse_header->total_chunks);
-
        /* verify sparse_header->blk_sz is an exact multiple of info->blksz */
        if (sparse_header->blk_sz !=
            (sparse_header->blk_sz & ~(info->blksz - 1))) {