Merge "imgdiff: Avoid infinite loop if inflate fails"
This commit is contained in:
@@ -408,6 +408,7 @@ unsigned char* ReadImage(const char* filename,
|
|||||||
p[2] == 0x08 && // deflate compression
|
p[2] == 0x08 && // deflate compression
|
||||||
p[3] == 0x00) { // no header flags
|
p[3] == 0x00) { // no header flags
|
||||||
// 'pos' is the offset of the start of a gzip chunk.
|
// 'pos' is the offset of the start of a gzip chunk.
|
||||||
|
size_t chunk_offset = pos;
|
||||||
|
|
||||||
*num_chunks += 3;
|
*num_chunks += 3;
|
||||||
*chunks = realloc(*chunks, *num_chunks * sizeof(ImageChunk));
|
*chunks = realloc(*chunks, *num_chunks * sizeof(ImageChunk));
|
||||||
@@ -453,6 +454,14 @@ unsigned char* ReadImage(const char* filename,
|
|||||||
strm.avail_out = allocated - curr->len;
|
strm.avail_out = allocated - curr->len;
|
||||||
strm.next_out = curr->data + curr->len;
|
strm.next_out = curr->data + curr->len;
|
||||||
ret = inflate(&strm, Z_NO_FLUSH);
|
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;
|
||||||
|
}
|
||||||
curr->len = allocated - strm.avail_out;
|
curr->len = allocated - strm.avail_out;
|
||||||
if (strm.avail_out == 0) {
|
if (strm.avail_out == 0) {
|
||||||
allocated *= 2;
|
allocated *= 2;
|
||||||
|
|||||||
Reference in New Issue
Block a user