Skip to content

Commit

Permalink
imgdiff: skip spurious gzip headers in image files
Browse files Browse the repository at this point in the history
dragon kernel is compressed via lz4 for boot speed and bootloader
support reasons and recent prebuilts happen to include the gzip header
sequence which is causing imgdiff to fail.

Detect a spurious gzip header and treat the section as a normal section.

Bug: 26133184
Change-Id: I369d7d576fd7d2c579c0780fc5c669a5b6ea0d3d
(cherry picked from commit 0f2f6a746af517afca9e5e089a4a17be0a9766d6)
Signed-off-by: David Riley <davidriley@google.com>
  • Loading branch information
David Riley authored and invisiblek committed Dec 28, 2015
1 parent 3010668 commit 46e4090
Showing 1 changed file with 14 additions and 6 deletions.
20 changes: 14 additions & 6 deletions applypatch/imgdiff.c
Expand Up @@ -122,6 +122,7 @@
*/

#include <errno.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Expand Down Expand Up @@ -405,6 +406,7 @@ unsigned char* ReadImage(const char* filename,
while (pos < sz) {
unsigned char* p = img+pos;

bool processed_deflate = false;
if (sz - pos >= 4 &&
p[0] == 0x1f && p[1] == 0x8b &&
p[2] == 0x08 && // deflate compression
Expand Down Expand Up @@ -457,18 +459,24 @@ unsigned char* ReadImage(const char* filename,
strm.next_out = curr->data + curr->len;
ret = inflate(&strm, Z_NO_FLUSH);
if (ret < 0) {
printf("Error: inflate failed [%s] at file offset [%zu]\n"
"imgdiff only supports gzip kernel compression,"
" did you try CONFIG_KERNEL_LZO?\n",
strm.msg, chunk_offset);
free(img);
return NULL;
if (!processed_deflate) {
// This is the first chunk, assume that it's just a spurious
// gzip header instead of a real one.
break;
}
printf("Error: inflate failed [%s] at file offset [%zu]\n"
"imgdiff only supports gzip kernel compression,"
" did you try CONFIG_KERNEL_LZO?\n",
strm.msg, chunk_offset);
free(img);
return NULL;
}
curr->len = allocated - strm.avail_out;
if (strm.avail_out == 0) {
allocated *= 2;
curr->data = realloc(curr->data, allocated);
}
processed_deflate = true;
} while (ret != Z_STREAM_END);

curr->deflate_len = st.st_size - strm.avail_in - pos;
Expand Down

0 comments on commit 46e4090

Please sign in to comment.