Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
M
Magisk
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
Magisk
Commits
0442d6d5
Commit
0442d6d5
authored
Mar 07, 2019
by
topjohnwu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Only compress kernel and ramdisk if input not compressed
parent
a3fc6d2a
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
50 additions
and
60 deletions
+50
-60
bootimg.cpp
native/jni/magiskboot/bootimg.cpp
+35
-15
compress.cpp
native/jni/magiskboot/compress.cpp
+0
-15
compress.h
native/jni/magiskboot/compress.h
+0
-3
format.h
native/jni/magiskboot/format.h
+1
-7
main.cpp
native/jni/magiskboot/main.cpp
+14
-20
No files found.
native/jni/magiskboot/bootimg.cpp
View file @
0442d6d5
#include <sys/mman.h>
#include <string.h>
#include <stdlib.h>
#include <stdlib.h>
#include <unistd.h>
#include <unistd.h>
#include <fcntl.h>
#include <fcntl.h>
#include <libfdt.h>
#include <libfdt.h>
#include <sys/mman.h>
#include <functional>
#include <memory>
#include <mincrypt/sha.h>
#include <mincrypt/sha.h>
#include <mincrypt/sha256.h>
#include <mincrypt/sha256.h>
...
@@ -13,9 +16,26 @@
...
@@ -13,9 +16,26 @@
#include "magiskboot.h"
#include "magiskboot.h"
#include "compress.h"
#include "compress.h"
using
namespace
std
;
uint32_t
dyn_img_hdr
::
j32
=
0
;
uint32_t
dyn_img_hdr
::
j32
=
0
;
uint64_t
dyn_img_hdr
::
j64
=
0
;
uint64_t
dyn_img_hdr
::
j64
=
0
;
static
int64_t
one_step
(
unique_ptr
<
Compression
>
&&
ptr
,
int
fd
,
const
void
*
in
,
size_t
size
)
{
ptr
->
set_out
(
make_unique
<
FDOutStream
>
(
fd
));
if
(
!
ptr
->
write
(
in
,
size
))
return
-
1
;
return
ptr
->
finalize
();
}
static
int64_t
decompress
(
format_t
type
,
int
fd
,
const
void
*
in
,
size_t
size
)
{
return
one_step
(
unique_ptr
<
Compression
>
(
get_decoder
(
type
)),
fd
,
in
,
size
);
}
static
int64_t
compress
(
format_t
type
,
int
fd
,
const
void
*
in
,
size_t
size
)
{
return
one_step
(
unique_ptr
<
Compression
>
(
get_encoder
(
type
)),
fd
,
in
,
size
);
}
static
void
dump
(
void
*
buf
,
size_t
size
,
const
char
*
filename
)
{
static
void
dump
(
void
*
buf
,
size_t
size
,
const
char
*
filename
)
{
if
(
size
==
0
)
if
(
size
==
0
)
return
;
return
;
...
@@ -329,15 +349,15 @@ void repack(const char* orig_image, const char* out_image) {
...
@@ -329,15 +349,15 @@ void repack(const char* orig_image, const char* out_image) {
write_zero
(
fd
,
512
);
write_zero
(
fd
,
512
);
}
}
if
(
access
(
KERNEL_FILE
,
R_OK
)
==
0
)
{
if
(
access
(
KERNEL_FILE
,
R_OK
)
==
0
)
{
if
(
COMPRESSED
(
boot
.
k_fmt
))
{
size_t
raw_size
;
size_t
raw_size
;
void
*
raw_buf
;
void
*
kernel_raw
;
mmap_ro
(
KERNEL_FILE
,
raw_buf
,
raw_size
);
mmap_ro
(
KERNEL_FILE
,
kernel_raw
,
raw_size
);
if
(
!
COMPRESSED
(
check_fmt
(
raw_buf
,
raw_size
))
&&
COMPRESSED
(
boot
.
k_fmt
))
{
boot
.
hdr
->
kernel_size
=
compress
(
boot
.
k_fmt
,
fd
,
kernel_raw
,
raw_size
);
boot
.
hdr
->
kernel_size
=
compress
(
boot
.
k_fmt
,
fd
,
raw_buf
,
raw_size
);
munmap
(
kernel_raw
,
raw_size
);
}
else
{
}
else
{
boot
.
hdr
->
kernel_size
=
restore
(
KERNEL_FILE
,
fd
);
boot
.
hdr
->
kernel_size
=
write
(
fd
,
raw_buf
,
raw_size
);
}
}
munmap
(
raw_buf
,
raw_size
);
}
}
// dtb
// dtb
...
@@ -352,15 +372,15 @@ void repack(const char* orig_image, const char* out_image) {
...
@@ -352,15 +372,15 @@ void repack(const char* orig_image, const char* out_image) {
write_zero
(
fd
,
512
);
write_zero
(
fd
,
512
);
}
}
if
(
access
(
RAMDISK_FILE
,
R_OK
)
==
0
)
{
if
(
access
(
RAMDISK_FILE
,
R_OK
)
==
0
)
{
if
(
COMPRESSED
(
boot
.
r_fmt
))
{
size_t
raw_size
;
size_t
cpio_size
;
void
*
raw_buf
;
void
*
cpio
;
mmap_ro
(
RAMDISK_FILE
,
raw_buf
,
raw_size
);
mmap_ro
(
RAMDISK_FILE
,
cpio
,
cpio_size
);
if
(
!
COMPRESSED
(
check_fmt
(
raw_buf
,
raw_size
))
&&
COMPRESSED
(
boot
.
r_fmt
))
{
boot
.
hdr
->
ramdisk_size
=
compress
(
boot
.
r_fmt
,
fd
,
cpio
,
cpio_size
);
boot
.
hdr
->
ramdisk_size
=
compress
(
boot
.
r_fmt
,
fd
,
raw_buf
,
raw_size
);
munmap
(
cpio
,
cpio_size
);
}
else
{
}
else
{
boot
.
hdr
->
ramdisk_size
=
restore
(
RAMDISK_FILE
,
fd
);
boot
.
hdr
->
ramdisk_size
=
write
(
fd
,
raw_buf
,
raw_size
);
}
}
munmap
(
raw_buf
,
raw_size
);
file_align
();
file_align
();
}
}
...
...
native/jni/magiskboot/compress.cpp
View file @
0442d6d5
...
@@ -14,14 +14,6 @@
...
@@ -14,14 +14,6 @@
using
namespace
std
;
using
namespace
std
;
int64_t
decompress
(
format_t
type
,
int
fd
,
const
void
*
from
,
size_t
size
)
{
return
unique_ptr
<
Compression
>
(
get_decoder
(
type
))
->
one_step
(
fd
,
from
,
size
);
}
int64_t
compress
(
format_t
type
,
int
fd
,
const
void
*
from
,
size_t
size
)
{
return
unique_ptr
<
Compression
>
(
get_encoder
(
type
))
->
one_step
(
fd
,
from
,
size
);
}
static
bool
read_file
(
FILE
*
fp
,
const
function
<
void
(
void
*
,
size_t
)
>
&
fn
)
{
static
bool
read_file
(
FILE
*
fp
,
const
function
<
void
(
void
*
,
size_t
)
>
&
fn
)
{
char
buf
[
4096
];
char
buf
[
4096
];
size_t
len
;
size_t
len
;
...
@@ -164,13 +156,6 @@ Compression *get_decoder(format_t type) {
...
@@ -164,13 +156,6 @@ Compression *get_decoder(format_t type) {
}
}
}
}
int64_t
Compression
::
one_step
(
int
outfd
,
const
void
*
in
,
size_t
size
)
{
set_out
(
make_unique
<
FDOutStream
>
(
outfd
));
if
(
!
write
(
in
,
size
))
return
-
1
;
return
finalize
();
}
GZStream
::
GZStream
(
int
mode
)
:
mode
(
mode
),
strm
({})
{
GZStream
::
GZStream
(
int
mode
)
:
mode
(
mode
),
strm
({})
{
switch
(
mode
)
{
switch
(
mode
)
{
case
0
:
case
0
:
...
...
native/jni/magiskboot/compress.h
View file @
0442d6d5
...
@@ -14,7 +14,6 @@
...
@@ -14,7 +14,6 @@
class
Compression
:
public
FilterOutStream
{
class
Compression
:
public
FilterOutStream
{
public
:
public
:
int64_t
one_step
(
int
outfd
,
const
void
*
in
,
size_t
size
);
virtual
uint64_t
finalize
()
=
0
;
virtual
uint64_t
finalize
()
=
0
;
};
};
...
@@ -171,7 +170,5 @@ private:
...
@@ -171,7 +170,5 @@ private:
Compression
*
get_encoder
(
format_t
type
);
Compression
*
get_encoder
(
format_t
type
);
Compression
*
get_decoder
(
format_t
type
);
Compression
*
get_decoder
(
format_t
type
);
int64_t
compress
(
format_t
type
,
int
fd
,
const
void
*
from
,
size_t
size
);
int64_t
decompress
(
format_t
type
,
int
fd
,
const
void
*
from
,
size_t
size
);
void
compress
(
const
char
*
method
,
const
char
*
infile
,
const
char
*
outfile
);
void
compress
(
const
char
*
method
,
const
char
*
infile
,
const
char
*
outfile
);
void
decompress
(
char
*
infile
,
const
char
*
outfile
);
void
decompress
(
char
*
infile
,
const
char
*
outfile
);
native/jni/magiskboot/format.h
View file @
0442d6d5
#ifndef _FORMAT_H_
#pragma once
#define _FORMAT_H_
#include <map>
#include <map>
#include <string_view>
#include <string_view>
...
@@ -50,9 +49,6 @@ typedef enum {
...
@@ -50,9 +49,6 @@ typedef enum {
#define ACCLAIM_MAGIC "BauwksBoot"
#define ACCLAIM_MAGIC "BauwksBoot"
#define ACCLAIM_PRE_HEADER_SZ 262144
#define ACCLAIM_PRE_HEADER_SZ 262144
#define SUP_LIST ((const char *[]) { "gzip", "xz", "lzma", "bzip2", "lz4", "lz4_legacy", NULL })
#define SUP_EXT_LIST ((const char *[]) { "gz", "xz", "lzma", "bz2", "lz4", "lz4", NULL })
class
Fmt2Name
{
class
Fmt2Name
{
public
:
public
:
const
char
*
operator
[](
format_t
fmt
);
const
char
*
operator
[](
format_t
fmt
);
...
@@ -68,5 +64,3 @@ format_t check_fmt(const void *buf, size_t len);
...
@@ -68,5 +64,3 @@ format_t check_fmt(const void *buf, size_t len);
extern
std
::
map
<
std
::
string_view
,
format_t
>
name2fmt
;
extern
std
::
map
<
std
::
string_view
,
format_t
>
name2fmt
;
extern
Fmt2Name
fmt2name
;
extern
Fmt2Name
fmt2name
;
extern
Fmt2Ext
fmt2ext
;
extern
Fmt2Ext
fmt2ext
;
#endif
native/jni/magiskboot/main.cpp
View file @
0442d6d5
...
@@ -14,20 +14,21 @@
...
@@ -14,20 +14,21 @@
static
void
usage
(
char
*
arg0
)
{
static
void
usage
(
char
*
arg0
)
{
fprintf
(
stderr
,
fprintf
(
stderr
,
FULL_VER
(
MagiskBoot
)
" - Boot Image Modification Tool
\n
"
"Usage: %s <action> [args...]
\n
"
"Usage: %s <action> [args...]
\n
"
"
\n
"
"
\n
"
"Supported actions:
\n
"
"Supported actions:
\n
"
" --unpack <bootimg>
\n
"
" --unpack <bootimg>
\n
"
" Unpack <bootimg> to kernel, ramdisk.cpio, and if available, second, dtb,
\n
"
" Unpack <bootimg> to, if available, kernel, ramdisk.cpio,
\n
"
" and extra into the current directory. Return values:
\n
"
" second, dtb, extra, and recovery_dtbo into current directory.
\n
"
" Return values:
\n
"
" 0:valid 1:error 2:chromeos 3:ELF32 4:ELF64
\n
"
" 0:valid 1:error 2:chromeos 3:ELF32 4:ELF64
\n
"
"
\n
"
"
\n
"
" --repack <origbootimg> [outbootimg]
\n
"
" --repack <origbootimg> [outbootimg]
\n
"
" Repack
kernel, ramdisk.cpio[.ext], second, dtb...
from current directory
\n
"
" Repack
boot image components
from current directory
\n
"
" to [outbootimg], or new-boot.img if not specified.
\n
"
" to [outbootimg], or new-boot.img if not specified.
\n
"
" It will compress ramdisk.cpio with the same method used in <origbootimg>,
\n
"
" It will compress ramdisk.cpio and kernel with the same method in
\n
"
" or attempt to find ramdisk.cpio.[ext], and repack directly with the
\n
"
" <origbootimg> if the file provided is not already compressed.
\n
"
" compressed ramdisk file
\n
"
"
\n
"
"
\n
"
" --hexpatch <file> <hexpattern1> <hexpattern2>
\n
"
" --hexpatch <file> <hexpattern1> <hexpattern2>
\n
"
" Search <hexpattern1> in <file>, and replace with <hexpattern2>
\n
"
" Search <hexpattern1> in <file>, and replace with <hexpattern2>
\n
"
...
@@ -80,16 +81,16 @@ static void usage(char *arg0) {
...
@@ -80,16 +81,16 @@ static void usage(char *arg0) {
" <infile>/[outfile] can be '-' to be STDIN/STDOUT
\n
"
" <infile>/[outfile] can be '-' to be STDIN/STDOUT
\n
"
" Supported methods: "
" Supported methods: "
,
arg0
);
,
arg0
);
for
(
int
i
=
0
;
SUP_LIST
[
i
];
++
i
)
for
(
auto
&
it
:
name2fmt
)
fprintf
(
stderr
,
"%s "
,
SUP_LIST
[
i
]
);
fprintf
(
stderr
,
"%s "
,
it
.
first
.
data
()
);
fprintf
(
stderr
,
fprintf
(
stderr
,
"
\n\n
"
"
\n\n
"
" --decompress <infile> [outfile]
\n
"
" --decompress <infile> [outfile]
\n
"
" Detect method and decompress <infile>, optionally to [outfile]
\n
"
" Detect method and decompress <infile>, optionally to [outfile]
\n
"
" <infile>/[outfile] can be '-' to be STDIN/STDOUT
\n
"
" <infile>/[outfile] can be '-' to be STDIN/STDOUT
\n
"
" Supported methods: "
);
" Supported methods: "
);
for
(
int
i
=
0
;
SUP_LIST
[
i
];
++
i
)
for
(
auto
&
it
:
name2fmt
)
fprintf
(
stderr
,
"%s "
,
SUP_LIST
[
i
]
);
fprintf
(
stderr
,
"%s "
,
it
.
first
.
data
()
);
fprintf
(
stderr
,
fprintf
(
stderr
,
"
\n\n
"
"
\n\n
"
" --sha1 <file>
\n
"
" --sha1 <file>
\n
"
...
@@ -104,31 +105,24 @@ static void usage(char *arg0) {
...
@@ -104,31 +105,24 @@ static void usage(char *arg0) {
int
main
(
int
argc
,
char
*
argv
[])
{
int
main
(
int
argc
,
char
*
argv
[])
{
cmdline_logging
();
cmdline_logging
();
fprintf
(
stderr
,
FULL_VER
(
MagiskBoot
)
" - Boot Image Modification Tool
\n
"
);
umask
(
0
);
umask
(
0
);
if
(
argc
>
1
&&
strcmp
(
argv
[
1
],
"--cleanup"
)
==
0
)
{
if
(
argc
>
1
&&
strcmp
(
argv
[
1
],
"--cleanup"
)
==
0
)
{
fprintf
(
stderr
,
"Cleaning up...
\n
"
);
fprintf
(
stderr
,
"Cleaning up...
\n
"
);
char
name
[
PATH_MAX
];
unlink
(
KERNEL_FILE
);
unlink
(
KERNEL_FILE
);
unlink
(
RAMDISK_FILE
);
unlink
(
RAMDISK_FILE
);
unlink
(
RAMDISK_FILE
".raw"
);
unlink
(
SECOND_FILE
);
unlink
(
SECOND_FILE
);
unlink
(
DTB_FILE
);
unlink
(
DTB_FILE
);
unlink
(
EXTRA_FILE
);
unlink
(
EXTRA_FILE
);
unlink
(
RECV_DTBO_FILE
);
unlink
(
RECV_DTBO_FILE
);
for
(
int
i
=
0
;
SUP_EXT_LIST
[
i
];
++
i
)
{
sprintf
(
name
,
"%s.%s"
,
RAMDISK_FILE
,
SUP_EXT_LIST
[
i
]);
unlink
(
name
);
}
}
else
if
(
argc
>
2
&&
strcmp
(
argv
[
1
],
"--sha1"
)
==
0
)
{
}
else
if
(
argc
>
2
&&
strcmp
(
argv
[
1
],
"--sha1"
)
==
0
)
{
uint8_t
sha1
[
SHA_DIGEST_SIZE
];
uint8_t
sha1
[
SHA_DIGEST_SIZE
];
void
*
buf
;
void
*
buf
;
size_t
size
;
size_t
size
;
mmap_ro
(
argv
[
2
],
buf
,
size
);
mmap_ro
(
argv
[
2
],
buf
,
size
);
SHA_hash
(
buf
,
size
,
sha1
);
SHA_hash
(
buf
,
size
,
sha1
);
for
(
int
i
=
0
;
i
<
SHA_DIGEST_SIZE
;
++
i
)
for
(
uint8_t
i
:
sha1
)
printf
(
"%02x"
,
sha1
[
i
]
);
printf
(
"%02x"
,
i
);
printf
(
"
\n
"
);
printf
(
"
\n
"
);
munmap
(
buf
,
size
);
munmap
(
buf
,
size
);
}
else
if
(
argc
>
2
&&
strcmp
(
argv
[
1
],
"--unpack"
)
==
0
)
{
}
else
if
(
argc
>
2
&&
strcmp
(
argv
[
1
],
"--unpack"
)
==
0
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment