Merge "imgdiff: skip spurious gzip headers in image files" am: 8e150a5b24
am: c1de9837e3
* commit 'c1de9837e3bdb64bc1f5d9779df7a944326f5f2b':
imgdiff: skip spurious gzip headers in image files
This commit is contained in:
commit
085fc1361f
1 changed files with 13 additions and 6 deletions
|
@ -407,6 +407,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
|
||||
|
@ -460,18 +461,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 = reinterpret_cast<unsigned char*>(realloc(curr->data, allocated));
|
||||
}
|
||||
processed_deflate = true;
|
||||
} while (ret != Z_STREAM_END);
|
||||
|
||||
curr->deflate_len = sz - strm.avail_in - pos;
|
||||
|
|
Loading…
Reference in a new issue