Skip to content

Commit 21f00fb

Browse files
authored
Allow patches even when verification fails (#231)
Before patching the kernel image, it is possible that the kernel coincidentally contains KP1158\x00\x00, causing the checksum of the later data to fail. This change loops through valid checksums and only determines a patched image if a valid checksum is found. If it is not found, it will be treated as a new image instead of just exiting.
1 parent b13cad2 commit 21f00fb

File tree

1 file changed

+27
-6
lines changed

1 file changed

+27
-6
lines changed

tools/patch.c

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,33 @@ int parse_image_patch_info(const char *kimg, int kimg_len, patched_kimg_t *pimg)
214214
if (!pimg->banner) tools_loge_exit("can't find linux banner\n");
215215

216216
// patched or new
217-
preset_t *old_preset = get_preset(kimg, kimg_len);
217+
preset_t *old_preset = NULL;
218+
const char *search_ptr = kimg;
219+
int search_len = kimg_len;
220+
int32_t saved_kimg_len = 0;
221+
int align_kimg_len = 0;
222+
223+
while (search_len > 0) {
224+
old_preset = get_preset(search_ptr, search_len);
225+
if (!old_preset) break;
226+
227+
saved_kimg_len = old_preset->setup.kimg_size;
228+
if (is_be() ^ kinfo->is_be) saved_kimg_len = i32swp(saved_kimg_len);
229+
230+
align_kimg_len = (char *)old_preset - kimg;
231+
if (align_kimg_len == (int)align_ceil(saved_kimg_len, SZ_4K)) {
232+
break;
233+
}
234+
235+
tools_logw("found magic string at 0x%x but saved kernel image size mismatch, ignoring (false positive?)\n",
236+
align_kimg_len);
237+
238+
// Search next
239+
search_ptr = (char *)old_preset + 1;
240+
search_len = kimg_len - (search_ptr - kimg);
241+
old_preset = NULL;
242+
}
243+
218244
pimg->preset = old_preset;
219245

220246
if (!old_preset) {
@@ -224,11 +250,6 @@ int parse_image_patch_info(const char *kimg, int kimg_len, patched_kimg_t *pimg)
224250
}
225251

226252
tools_logi("patched kernel image ...\n");
227-
int32_t saved_kimg_len = old_preset->setup.kimg_size;
228-
if (is_be() ^ kinfo->is_be) saved_kimg_len = i32swp(saved_kimg_len);
229-
230-
int align_kimg_len = (char *)old_preset - kimg;
231-
if (align_kimg_len != (int)align_ceil(saved_kimg_len, SZ_4K)) tools_loge_exit("saved kernel image size error\n");
232253
pimg->ori_kimg_len = saved_kimg_len;
233254

234255
memcpy((char *)kimg, old_preset->setup.header_backup, sizeof(old_preset->setup.header_backup));

0 commit comments

Comments
 (0)