From 9b60c005c7b5ff2056176be57c8b130c30dee490 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sun, 13 Mar 2022 04:23:00 -0700 Subject: [PATCH] Support multiple CPIO concatenated --- native/jni/magiskboot/cpio.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/native/jni/magiskboot/cpio.cpp b/native/jni/magiskboot/cpio.cpp index 8b64c47da..593e1c115 100644 --- a/native/jni/magiskboot/cpio.cpp +++ b/native/jni/magiskboot/cpio.cpp @@ -210,16 +210,25 @@ bool cpio::mv(const char *from, const char *to) { void cpio::load_cpio(const char *buf, size_t sz) { size_t pos = 0; while (pos < sz) { - auto header = reinterpret_cast(buf + pos); + auto hdr = reinterpret_cast(buf + pos); + if (memcmp(hdr->magic, "070701", 6) != 0) + LOGE("bad cpio header\n"); pos += sizeof(cpio_newc_header); string_view name(buf + pos); - pos += x8u(header->namesize); + pos += x8u(hdr->namesize); pos_align(pos); if (name == "." || name == "..") continue; - if (name == "TRAILER!!!") - break; - auto entry = new cpio_entry(header); + if (name == "TRAILER!!!") { + // Android support multiple CPIO being concatenated + // Search for the next cpio header + auto next = static_cast(memmem(buf + pos, sz - pos, "070701", 6)); + if (next == nullptr) + break; + pos = next - buf; + continue; + } + auto entry = new cpio_entry(hdr); entry->data = xmalloc(entry->filesize); memcpy(entry->data, buf + pos, entry->filesize); pos += entry->filesize;