mirror of
https://github.com/topjohnwu/Magisk.git
synced 2025-02-21 15:18:29 +00:00
Skip image padding on Pixel C
This commit is contained in:
parent
d6dbab53cd
commit
8b5652ced5
@ -395,6 +395,8 @@ write_zero(fd, align_off(lseek(fd, 0, SEEK_CUR) - off.header, boot.hdr->page_siz
|
|||||||
void repack(const char* src_img, const char* out_img, bool nocomp) {
|
void repack(const char* src_img, const char* out_img, bool nocomp) {
|
||||||
boot_img boot(src_img);
|
boot_img boot(src_img);
|
||||||
|
|
||||||
|
auto is_flag = [&](unsigned flag) -> bool { return (boot.flags & flag); };
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
uint32_t header;
|
uint32_t header;
|
||||||
uint32_t kernel;
|
uint32_t kernel;
|
||||||
@ -423,7 +425,7 @@ void repack(const char* src_img, const char* out_img, bool nocomp) {
|
|||||||
// Create new image
|
// Create new image
|
||||||
int fd = creat(out_img, 0644);
|
int fd = creat(out_img, 0644);
|
||||||
|
|
||||||
if (boot.flags & DHTB_FLAG) {
|
if (is_flag(DHTB_FLAG)) {
|
||||||
// Skip DHTB header
|
// Skip DHTB header
|
||||||
write_zero(fd, sizeof(dhtb_hdr));
|
write_zero(fd, sizeof(dhtb_hdr));
|
||||||
} else if (boot.flags & BLOB_FLAG) {
|
} else if (boot.flags & BLOB_FLAG) {
|
||||||
@ -440,7 +442,7 @@ void repack(const char* src_img, const char* out_img, bool nocomp) {
|
|||||||
|
|
||||||
// kernel
|
// kernel
|
||||||
off.kernel = lseek(fd, 0, SEEK_CUR);
|
off.kernel = lseek(fd, 0, SEEK_CUR);
|
||||||
if (boot.flags & MTK_KERNEL) {
|
if (is_flag(MTK_KERNEL)) {
|
||||||
// Copy MTK headers
|
// Copy MTK headers
|
||||||
restore_buf(fd, boot.k_hdr, sizeof(mtk_hdr));
|
restore_buf(fd, boot.k_hdr, sizeof(mtk_hdr));
|
||||||
}
|
}
|
||||||
@ -463,7 +465,7 @@ void repack(const char* src_img, const char* out_img, bool nocomp) {
|
|||||||
|
|
||||||
// ramdisk
|
// ramdisk
|
||||||
off.ramdisk = lseek(fd, 0, SEEK_CUR);
|
off.ramdisk = lseek(fd, 0, SEEK_CUR);
|
||||||
if (boot.flags & MTK_RAMDISK) {
|
if (is_flag(MTK_RAMDISK)) {
|
||||||
// Copy MTK headers
|
// Copy MTK headers
|
||||||
restore_buf(fd, boot.r_hdr, sizeof(mtk_hdr));
|
restore_buf(fd, boot.r_hdr, sizeof(mtk_hdr));
|
||||||
}
|
}
|
||||||
@ -517,19 +519,21 @@ void repack(const char* src_img, const char* out_img, bool nocomp) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Append tail info
|
// Append tail info
|
||||||
if (boot.flags & SEANDROID_FLAG) {
|
if (is_flag(SEANDROID_FLAG)) {
|
||||||
restore_buf(fd, SEANDROID_MAGIC "\xFF\xFF\xFF\xFF", 20);
|
restore_buf(fd, SEANDROID_MAGIC "\xFF\xFF\xFF\xFF", 20);
|
||||||
}
|
}
|
||||||
if (boot.flags & LG_BUMP_FLAG) {
|
if (is_flag(LG_BUMP_FLAG)) {
|
||||||
restore_buf(fd, LG_BUMP_MAGIC, 16);
|
restore_buf(fd, LG_BUMP_MAGIC, 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pad image to at least original size
|
// Pad image to at least original size if not chromeos (as it requires post processing)
|
||||||
|
if (!is_flag(CHROMEOS_FLAG)) {
|
||||||
auto current_sz = lseek(fd, 0, SEEK_CUR);
|
auto current_sz = lseek(fd, 0, SEEK_CUR);
|
||||||
if (current_sz < boot.map_size) {
|
if (current_sz < boot.map_size) {
|
||||||
int padding = boot.map_size - current_sz;
|
int padding = boot.map_size - current_sz;
|
||||||
write_zero(fd, padding);
|
write_zero(fd, padding);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
@ -542,12 +546,12 @@ void repack(const char* src_img, const char* out_img, bool nocomp) {
|
|||||||
mmap_rw(out_img, boot.map_addr, boot.map_size);
|
mmap_rw(out_img, boot.map_addr, boot.map_size);
|
||||||
|
|
||||||
// MTK headers
|
// MTK headers
|
||||||
if (boot.flags & MTK_KERNEL) {
|
if (is_flag(MTK_KERNEL)) {
|
||||||
auto hdr = reinterpret_cast<mtk_hdr *>(boot.map_addr + off.kernel);
|
auto hdr = reinterpret_cast<mtk_hdr *>(boot.map_addr + off.kernel);
|
||||||
hdr->size = boot.hdr->kernel_size();
|
hdr->size = boot.hdr->kernel_size();
|
||||||
boot.hdr->kernel_size() += sizeof(*hdr);
|
boot.hdr->kernel_size() += sizeof(*hdr);
|
||||||
}
|
}
|
||||||
if (boot.flags & MTK_RAMDISK) {
|
if (is_flag(MTK_RAMDISK)) {
|
||||||
auto hdr = reinterpret_cast<mtk_hdr *>(boot.map_addr + off.ramdisk);
|
auto hdr = reinterpret_cast<mtk_hdr *>(boot.map_addr + off.ramdisk);
|
||||||
hdr->size = boot.hdr->ramdisk_size();
|
hdr->size = boot.hdr->ramdisk_size();
|
||||||
boot.hdr->ramdisk_size() += sizeof(*hdr);
|
boot.hdr->ramdisk_size() += sizeof(*hdr);
|
||||||
@ -555,7 +559,7 @@ void repack(const char* src_img, const char* out_img, bool nocomp) {
|
|||||||
|
|
||||||
// Update checksum
|
// Update checksum
|
||||||
HASH_CTX ctx;
|
HASH_CTX ctx;
|
||||||
(boot.flags & SHA256_FLAG) ? SHA256_init(&ctx) : SHA_init(&ctx);
|
is_flag(SHA256_FLAG) ? SHA256_init(&ctx) : SHA_init(&ctx);
|
||||||
uint32_t size = boot.hdr->kernel_size();
|
uint32_t size = boot.hdr->kernel_size();
|
||||||
HASH_update(&ctx, boot.map_addr + off.kernel, size);
|
HASH_update(&ctx, boot.map_addr + off.kernel, size);
|
||||||
HASH_update(&ctx, &size, sizeof(size));
|
HASH_update(&ctx, &size, sizeof(size));
|
||||||
@ -591,13 +595,13 @@ void repack(const char* src_img, const char* out_img, bool nocomp) {
|
|||||||
// Main header
|
// Main header
|
||||||
memcpy(boot.map_addr + off.header, **boot.hdr, boot.hdr->hdr_size());
|
memcpy(boot.map_addr + off.header, **boot.hdr, boot.hdr->hdr_size());
|
||||||
|
|
||||||
if (boot.flags & DHTB_FLAG) {
|
if (is_flag(DHTB_FLAG)) {
|
||||||
// DHTB header
|
// DHTB header
|
||||||
auto hdr = reinterpret_cast<dhtb_hdr *>(boot.map_addr);
|
auto hdr = reinterpret_cast<dhtb_hdr *>(boot.map_addr);
|
||||||
memcpy(hdr, DHTB_MAGIC, 8);
|
memcpy(hdr, DHTB_MAGIC, 8);
|
||||||
hdr->size = boot.map_size - sizeof(dhtb_hdr);
|
hdr->size = boot.map_size - sizeof(dhtb_hdr);
|
||||||
SHA256_hash(boot.map_addr + sizeof(dhtb_hdr), hdr->size, hdr->checksum);
|
SHA256_hash(boot.map_addr + sizeof(dhtb_hdr), hdr->size, hdr->checksum);
|
||||||
} else if (boot.flags & BLOB_FLAG) {
|
} else if (is_flag(BLOB_FLAG)) {
|
||||||
// Blob header
|
// Blob header
|
||||||
auto hdr = reinterpret_cast<blob_hdr *>(boot.map_addr);
|
auto hdr = reinterpret_cast<blob_hdr *>(boot.map_addr);
|
||||||
hdr->size = boot.map_size - sizeof(blob_hdr);
|
hdr->size = boot.map_size - sizeof(blob_hdr);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user