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
fc8a3c5f
Commit
fc8a3c5f
authored
Oct 25, 2018
by
topjohnwu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Migrate MagiskBoot to C++
parent
01e7dff1
Show whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
683 additions
and
254 deletions
+683
-254
Android.mk
native/jni/Android.mk
+8
-8
bootimg.cpp
native/jni/magiskboot/bootimg.cpp
+4
-6
compress.cpp
native/jni/magiskboot/compress.cpp
+54
-51
cpio.cpp
native/jni/magiskboot/cpio.cpp
+272
-0
cpio.h
native/jni/magiskboot/cpio.h
+44
-36
dtb.cpp
native/jni/magiskboot/dtb.cpp
+9
-7
format.cpp
native/jni/magiskboot/format.cpp
+1
-1
format.h
native/jni/magiskboot/format.h
+2
-2
hexpatch.cpp
native/jni/magiskboot/hexpatch.cpp
+8
-8
magiskboot.h
native/jni/magiskboot/magiskboot.h
+6
-7
main.cpp
native/jni/magiskboot/main.cpp
+7
-4
pattern.cpp
native/jni/magiskboot/pattern.cpp
+3
-3
ramdisk.cpp
native/jni/magiskboot/ramdisk.cpp
+112
-121
array.h
native/jni/utils/include/array.h
+138
-0
logging.h
native/jni/utils/include/logging.h
+7
-0
utils.h
native/jni/utils/include/utils.h
+8
-0
No files found.
native/jni/Android.mk
View file @
fc8a3c5f
...
@@ -100,15 +100,15 @@ LOCAL_C_INCLUDES := \
...
@@ -100,15 +100,15 @@ LOCAL_C_INCLUDES := \
$(LIBUTILS)
$(LIBUTILS)
LOCAL_SRC_FILES := \
LOCAL_SRC_FILES := \
magiskboot/
cpio.c
\
magiskboot/
main.cpp
\
magiskboot/
main.c
\
magiskboot/
cpio.cpp
\
magiskboot/bootimg.cpp \
magiskboot/bootimg.cpp \
magiskboot/hexpatch.c \
magiskboot/hexpatch.c
pp
\
magiskboot/compress.c \
magiskboot/compress.c
pp
\
magiskboot/format.c \
magiskboot/format.c
pp
\
magiskboot/dtb.c \
magiskboot/dtb.c
pp
\
magiskboot/ramdisk.c \
magiskboot/ramdisk.c
pp
\
magiskboot/pattern.c
magiskboot/pattern.c
pp
LOCAL_LDLIBS := -lz
LOCAL_LDLIBS := -lz
include $(BUILD_EXECUTABLE)
include $(BUILD_EXECUTABLE)
...
...
native/jni/magiskboot/bootimg.cpp
View file @
fc8a3c5f
...
@@ -7,12 +7,10 @@
...
@@ -7,12 +7,10 @@
#include <mincrypt/sha.h>
#include <mincrypt/sha.h>
#include <mincrypt/sha256.h>
#include <mincrypt/sha256.h>
extern
"C"
{
#include "bootimg.h"
#include "bootimg.h"
#include "magiskboot.h"
#include "magiskboot.h"
#include "utils.h"
#include "utils.h"
#include "logging.h"
#include "logging.h"
}
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
)
...
@@ -259,7 +257,7 @@ int unpack(const char *image) {
...
@@ -259,7 +257,7 @@ int unpack(const char *image) {
// Dump kernel
// Dump kernel
if
(
COMPRESSED
(
boot
.
k_fmt
))
{
if
(
COMPRESSED
(
boot
.
k_fmt
))
{
fd
=
creat
(
KERNEL_FILE
,
0644
);
fd
=
creat
(
KERNEL_FILE
,
0644
);
decomp
(
boot
.
k_fmt
,
fd
,
boot
.
kernel
,
boot
.
hdr
->
kernel_size
);
decomp
ress
(
boot
.
k_fmt
,
fd
,
boot
.
kernel
,
boot
.
hdr
->
kernel_size
);
close
(
fd
);
close
(
fd
);
}
else
{
}
else
{
dump
(
boot
.
kernel
,
boot
.
hdr
->
kernel_size
,
KERNEL_FILE
);
dump
(
boot
.
kernel
,
boot
.
hdr
->
kernel_size
,
KERNEL_FILE
);
...
@@ -271,7 +269,7 @@ int unpack(const char *image) {
...
@@ -271,7 +269,7 @@ int unpack(const char *image) {
// Dump ramdisk
// Dump ramdisk
if
(
COMPRESSED
(
boot
.
r_fmt
))
{
if
(
COMPRESSED
(
boot
.
r_fmt
))
{
fd
=
creat
(
RAMDISK_FILE
,
0644
);
fd
=
creat
(
RAMDISK_FILE
,
0644
);
decomp
(
boot
.
r_fmt
,
fd
,
boot
.
ramdisk
,
boot
.
hdr
->
ramdisk_size
);
decomp
ress
(
boot
.
r_fmt
,
fd
,
boot
.
ramdisk
,
boot
.
hdr
->
ramdisk_size
);
close
(
fd
);
close
(
fd
);
}
else
{
}
else
{
dump
(
boot
.
ramdisk
,
boot
.
hdr
->
ramdisk_size
,
RAMDISK_FILE
);
dump
(
boot
.
ramdisk
,
boot
.
hdr
->
ramdisk_size
,
RAMDISK_FILE
);
...
@@ -335,7 +333,7 @@ void repack(const char* orig_image, const char* out_image) {
...
@@ -335,7 +333,7 @@ void repack(const char* orig_image, const char* out_image) {
size_t
raw_size
;
size_t
raw_size
;
void
*
kernel_raw
;
void
*
kernel_raw
;
mmap_ro
(
KERNEL_FILE
,
&
kernel_raw
,
&
raw_size
);
mmap_ro
(
KERNEL_FILE
,
&
kernel_raw
,
&
raw_size
);
boot
.
hdr
->
kernel_size
=
comp
(
boot
.
k_fmt
,
fd
,
kernel_raw
,
raw_size
);
boot
.
hdr
->
kernel_size
=
comp
ress
(
boot
.
k_fmt
,
fd
,
kernel_raw
,
raw_size
);
munmap
(
kernel_raw
,
raw_size
);
munmap
(
kernel_raw
,
raw_size
);
}
else
{
}
else
{
boot
.
hdr
->
kernel_size
=
restore
(
KERNEL_FILE
,
fd
);
boot
.
hdr
->
kernel_size
=
restore
(
KERNEL_FILE
,
fd
);
...
@@ -358,7 +356,7 @@ void repack(const char* orig_image, const char* out_image) {
...
@@ -358,7 +356,7 @@ void repack(const char* orig_image, const char* out_image) {
size_t
cpio_size
;
size_t
cpio_size
;
void
*
cpio
;
void
*
cpio
;
mmap_ro
(
RAMDISK_FILE
,
&
cpio
,
&
cpio_size
);
mmap_ro
(
RAMDISK_FILE
,
&
cpio
,
&
cpio_size
);
boot
.
hdr
->
ramdisk_size
=
comp
(
boot
.
r_fmt
,
fd
,
cpio
,
cpio_size
);
boot
.
hdr
->
ramdisk_size
=
comp
ress
(
boot
.
r_fmt
,
fd
,
cpio
,
cpio_size
);
munmap
(
cpio
,
cpio_size
);
munmap
(
cpio
,
cpio_size
);
}
else
{
}
else
{
boot
.
hdr
->
ramdisk_size
=
restore
(
RAMDISK_FILE
,
fd
);
boot
.
hdr
->
ramdisk_size
=
restore
(
RAMDISK_FILE
,
fd
);
...
...
native/jni/magiskboot/compress.c
→
native/jni/magiskboot/compress.c
pp
View file @
fc8a3c5f
...
@@ -39,7 +39,7 @@ size_t gzip(int mode, int fd, const void *buf, size_t size) {
...
@@ -39,7 +39,7 @@ size_t gzip(int mode, int fd, const void *buf, size_t size) {
if
(
ret
!=
Z_OK
)
if
(
ret
!=
Z_OK
)
LOGE
(
"Unable to init zlib stream
\n
"
);
LOGE
(
"Unable to init zlib stream
\n
"
);
strm
.
next_in
=
(
void
*
)
buf
;
strm
.
next_in
=
(
Bytef
*
)
buf
;
strm
.
avail_in
=
size
;
strm
.
avail_in
=
size
;
do
{
do
{
...
@@ -73,7 +73,7 @@ size_t gzip(int mode, int fd, const void *buf, size_t size) {
...
@@ -73,7 +73,7 @@ size_t gzip(int mode, int fd, const void *buf, size_t size) {
// Mode: 0 = decode xz/lzma; 1 = encode xz; 2 = encode lzma
// Mode: 0 = decode xz/lzma; 1 = encode xz; 2 = encode lzma
size_t
lzma
(
int
mode
,
int
fd
,
const
void
*
buf
,
size_t
size
)
{
size_t
lzma
(
int
mode
,
int
fd
,
const
void
*
buf
,
size_t
size
)
{
size_t
have
,
total
=
0
;
size_t
have
,
total
=
0
;
lzma_ret
ret
=
0
;
lzma_ret
ret
=
LZMA_OK
;
lzma_stream
strm
=
LZMA_STREAM_INIT
;
lzma_stream
strm
=
LZMA_STREAM_INIT
;
lzma_options_lzma
opt
;
lzma_options_lzma
opt
;
unsigned
char
out
[
CHUNK
];
unsigned
char
out
[
CHUNK
];
...
@@ -82,7 +82,7 @@ size_t lzma(int mode, int fd, const void *buf, size_t size) {
...
@@ -82,7 +82,7 @@ size_t lzma(int mode, int fd, const void *buf, size_t size) {
lzma_lzma_preset
(
&
opt
,
9
);
lzma_lzma_preset
(
&
opt
,
9
);
lzma_filter
filters
[]
=
{
lzma_filter
filters
[]
=
{
{
.
id
=
LZMA_FILTER_LZMA2
,
.
options
=
&
opt
},
{
.
id
=
LZMA_FILTER_LZMA2
,
.
options
=
&
opt
},
{
.
id
=
LZMA_VLI_UNKNOWN
,
.
options
=
NULL
},
{
.
id
=
LZMA_VLI_UNKNOWN
,
.
options
=
nullptr
},
};
};
switch
(
mode
)
{
switch
(
mode
)
{
...
@@ -101,7 +101,7 @@ size_t lzma(int mode, int fd, const void *buf, size_t size) {
...
@@ -101,7 +101,7 @@ size_t lzma(int mode, int fd, const void *buf, size_t size) {
if
(
ret
!=
LZMA_OK
)
if
(
ret
!=
LZMA_OK
)
LOGE
(
"Unable to init lzma stream
\n
"
);
LOGE
(
"Unable to init lzma stream
\n
"
);
strm
.
next_in
=
buf
;
strm
.
next_in
=
static_cast
<
const
uint8_t
*>
(
buf
)
;
strm
.
avail_in
=
size
;
strm
.
avail_in
=
size
;
do
{
do
{
...
@@ -119,14 +119,14 @@ size_t lzma(int mode, int fd, const void *buf, size_t size) {
...
@@ -119,14 +119,14 @@ size_t lzma(int mode, int fd, const void *buf, size_t size) {
}
}
// Mode: 0 = decode; 1 = encode
// Mode: 0 = decode; 1 = encode
size_t
lz4
(
int
mode
,
int
fd
,
const
void
*
buf
,
size_t
size
)
{
size_t
lz4
(
int
mode
,
int
fd
,
const
uint8_t
*
buf
,
size_t
size
)
{
LZ4F_decompressionContext_t
dctx
;
LZ4F_decompressionContext_t
dctx
;
LZ4F_compressionContext_t
cctx
;
LZ4F_compressionContext_t
cctx
;
LZ4F_frameInfo_t
info
;
LZ4F_frameInfo_t
info
;
size_t
blockSize
,
outCapacity
,
avail_in
,
ret
=
0
,
pos
=
0
,
total
=
0
;
size_t
blockSize
,
outCapacity
,
avail_in
,
ret
=
0
,
pos
=
0
,
total
=
0
;
size_t
have
,
read
;
size_t
have
,
read
;
void
*
out
=
NULL
;
uint8_t
*
out
=
nullptr
;
// Initialize context
// Initialize context
switch
(
mode
)
{
switch
(
mode
)
{
...
@@ -162,21 +162,21 @@ size_t lz4(int mode, int fd, const void *buf, size_t size) {
...
@@ -162,21 +162,21 @@ size_t lz4(int mode, int fd, const void *buf, size_t size) {
pos
+=
read
;
pos
+=
read
;
break
;
break
;
case
1
:
case
1
:
outCapacity
=
LZ4F_compressFrameBound
(
blockSize
,
NULL
);
outCapacity
=
LZ4F_compressFrameBound
(
blockSize
,
nullptr
);
break
;
break
;
}
}
out
=
xmalloc
(
outCapacity
)
;
out
=
new
uint8_t
[
outCapacity
]
;
// Write header
// Write header
if
(
mode
==
1
)
{
if
(
mode
==
1
)
{
LZ4F_preferences_t
prefs
;
LZ4F_preferences_t
prefs
=
LZ4F_preferences_t
();
memset
(
&
prefs
,
0
,
sizeof
(
prefs
));
prefs
.
autoFlush
=
1
;
prefs
.
autoFlush
=
1
;
prefs
.
compressionLevel
=
9
;
prefs
.
compressionLevel
=
9
;
prefs
.
frameInfo
.
blockMode
=
1
;
prefs
.
frameInfo
.
blockMode
=
LZ4F_blockIndependent
;
prefs
.
frameInfo
.
blockSizeID
=
7
;
prefs
.
frameInfo
.
blockSizeID
=
LZ4F_max4MB
;
prefs
.
frameInfo
.
contentChecksumFlag
=
1
;
prefs
.
frameInfo
.
blockChecksumFlag
=
LZ4F_noBlockChecksum
;
prefs
.
frameInfo
.
contentChecksumFlag
=
LZ4F_contentChecksumEnabled
;
have
=
ret
=
LZ4F_compressBegin
(
cctx
,
out
,
size
,
&
prefs
);
have
=
ret
=
LZ4F_compressBegin
(
cctx
,
out
,
size
,
&
prefs
);
if
(
LZ4F_isError
(
ret
))
if
(
LZ4F_isError
(
ret
))
LOGE
(
"Failed to start compression: error %s
\n
"
,
LZ4F_getErrorName
(
ret
));
LOGE
(
"Failed to start compression: error %s
\n
"
,
LZ4F_getErrorName
(
ret
));
...
@@ -195,11 +195,11 @@ size_t lz4(int mode, int fd, const void *buf, size_t size) {
...
@@ -195,11 +195,11 @@ size_t lz4(int mode, int fd, const void *buf, size_t size) {
case
0
:
case
0
:
have
=
outCapacity
;
have
=
outCapacity
;
read
=
avail_in
;
read
=
avail_in
;
ret
=
LZ4F_decompress
(
dctx
,
out
,
&
have
,
buf
+
pos
,
&
read
,
NULL
);
ret
=
LZ4F_decompress
(
dctx
,
out
,
&
have
,
buf
+
pos
,
&
read
,
nullptr
);
break
;
break
;
case
1
:
case
1
:
read
=
avail_in
;
read
=
avail_in
;
have
=
ret
=
LZ4F_compressUpdate
(
cctx
,
out
,
outCapacity
,
buf
+
pos
,
avail_in
,
NULL
);
have
=
ret
=
LZ4F_compressUpdate
(
cctx
,
out
,
outCapacity
,
buf
+
pos
,
avail_in
,
nullptr
);
break
;
break
;
}
}
if
(
LZ4F_isError
(
ret
))
if
(
LZ4F_isError
(
ret
))
...
@@ -218,7 +218,7 @@ size_t lz4(int mode, int fd, const void *buf, size_t size) {
...
@@ -218,7 +218,7 @@ size_t lz4(int mode, int fd, const void *buf, size_t size) {
LZ4F_freeDecompressionContext
(
dctx
);
LZ4F_freeDecompressionContext
(
dctx
);
break
;
break
;
case
1
:
case
1
:
have
=
ret
=
LZ4F_compressEnd
(
cctx
,
out
,
outCapacity
,
NULL
);
have
=
ret
=
LZ4F_compressEnd
(
cctx
,
out
,
outCapacity
,
nullptr
);
if
(
LZ4F_isError
(
ret
))
if
(
LZ4F_isError
(
ret
))
LOGE
(
"Failed to end compression: error %s
\n
"
,
LZ4F_getErrorName
(
ret
));
LOGE
(
"Failed to end compression: error %s
\n
"
,
LZ4F_getErrorName
(
ret
));
...
@@ -228,7 +228,7 @@ size_t lz4(int mode, int fd, const void *buf, size_t size) {
...
@@ -228,7 +228,7 @@ size_t lz4(int mode, int fd, const void *buf, size_t size) {
break
;
break
;
}
}
free
(
out
)
;
delete
[]
out
;
return
total
;
return
total
;
}
}
...
@@ -238,9 +238,9 @@ size_t bzip2(int mode, int fd, const void* buf, size_t size) {
...
@@ -238,9 +238,9 @@ size_t bzip2(int mode, int fd, const void* buf, size_t size) {
bz_stream
strm
;
bz_stream
strm
;
char
out
[
CHUNK
];
char
out
[
CHUNK
];
strm
.
bzalloc
=
NULL
;
strm
.
bzalloc
=
nullptr
;
strm
.
bzfree
=
NULL
;
strm
.
bzfree
=
nullptr
;
strm
.
opaque
=
NULL
;
strm
.
opaque
=
nullptr
;
switch
(
mode
)
{
switch
(
mode
)
{
case
0
:
case
0
:
...
@@ -254,7 +254,7 @@ size_t bzip2(int mode, int fd, const void* buf, size_t size) {
...
@@ -254,7 +254,7 @@ size_t bzip2(int mode, int fd, const void* buf, size_t size) {
if
(
ret
!=
BZ_OK
)
if
(
ret
!=
BZ_OK
)
LOGE
(
"Unable to init bzlib stream
\n
"
);
LOGE
(
"Unable to init bzlib stream
\n
"
);
strm
.
next_in
=
(
void
*
)
buf
;
strm
.
next_in
=
(
char
*
)
buf
;
strm
.
avail_in
=
size
;
strm
.
avail_in
=
size
;
do
{
do
{
...
@@ -286,7 +286,7 @@ size_t bzip2(int mode, int fd, const void* buf, size_t size) {
...
@@ -286,7 +286,7 @@ size_t bzip2(int mode, int fd, const void* buf, size_t size) {
#define LZ4_LEGACY_BLOCKSIZE 0x800000
#define LZ4_LEGACY_BLOCKSIZE 0x800000
// Mode: 0 = decode; 1 = encode
// Mode: 0 = decode; 1 = encode
size_t
lz4_legacy
(
int
mode
,
int
fd
,
const
void
*
buf
,
size_t
size
)
{
size_t
lz4_legacy
(
int
mode
,
int
fd
,
const
uint8_t
*
buf
,
size_t
size
)
{
size_t
pos
=
0
;
size_t
pos
=
0
;
int
have
;
int
have
;
char
*
out
;
char
*
out
;
...
@@ -294,12 +294,12 @@ size_t lz4_legacy(int mode, int fd, const void* buf, size_t size) {
...
@@ -294,12 +294,12 @@ size_t lz4_legacy(int mode, int fd, const void* buf, size_t size) {
switch
(
mode
)
{
switch
(
mode
)
{
case
0
:
case
0
:
out
=
xmalloc
(
LZ4_LEGACY_BLOCKSIZE
)
;
out
=
new
char
[
LZ4_LEGACY_BLOCKSIZE
]
;
// Skip magic
// Skip magic
pos
+=
4
;
pos
+=
4
;
break
;
break
;
case
1
:
case
1
:
out
=
xmalloc
(
LZ4_COMPRESSBOUND
(
LZ4_LEGACY_BLOCKSIZE
))
;
out
=
new
char
[
LZ4_COMPRESSBOUND
(
LZ4_LEGACY_BLOCKSIZE
)]
;
// Write magic
// Write magic
total
+=
xwrite
(
fd
,
"
\x02\x21\x4c\x18
"
,
4
);
total
+=
xwrite
(
fd
,
"
\x02\x21\x4c\x18
"
,
4
);
break
;
break
;
...
@@ -313,7 +313,7 @@ size_t lz4_legacy(int mode, int fd, const void* buf, size_t size) {
...
@@ -313,7 +313,7 @@ size_t lz4_legacy(int mode, int fd, const void* buf, size_t size) {
pos
+=
4
;
pos
+=
4
;
if
(
block_size
>
LZ4_COMPRESSBOUND
(
LZ4_LEGACY_BLOCKSIZE
))
if
(
block_size
>
LZ4_COMPRESSBOUND
(
LZ4_LEGACY_BLOCKSIZE
))
goto
done
;
goto
done
;
have
=
LZ4_decompress_safe
(
buf
+
pos
,
out
,
block_size
,
LZ4_LEGACY_BLOCKSIZE
);
have
=
LZ4_decompress_safe
(
(
const
char
*
)
buf
+
pos
,
out
,
block_size
,
LZ4_LEGACY_BLOCKSIZE
);
if
(
have
<
0
)
if
(
have
<
0
)
LOGE
(
"Cannot decode lz4_legacy block
\n
"
);
LOGE
(
"Cannot decode lz4_legacy block
\n
"
);
pos
+=
block_size
;
pos
+=
block_size
;
...
@@ -323,7 +323,7 @@ size_t lz4_legacy(int mode, int fd, const void* buf, size_t size) {
...
@@ -323,7 +323,7 @@ size_t lz4_legacy(int mode, int fd, const void* buf, size_t size) {
insize
=
size
-
pos
;
insize
=
size
-
pos
;
else
else
insize
=
LZ4_LEGACY_BLOCKSIZE
;
insize
=
LZ4_LEGACY_BLOCKSIZE
;
have
=
LZ4_compress_HC
(
buf
+
pos
,
out
,
insize
,
LZ4_COMPRESSBOUND
(
LZ4_LEGACY_BLOCKSIZE
),
9
);
have
=
LZ4_compress_HC
(
(
const
char
*
)
buf
+
pos
,
out
,
insize
,
LZ4_COMPRESSBOUND
(
LZ4_LEGACY_BLOCKSIZE
),
9
);
if
(
have
==
0
)
if
(
have
==
0
)
LOGE
(
"lz4_legacy compression error
\n
"
);
LOGE
(
"lz4_legacy compression error
\n
"
);
pos
+=
insize
;
pos
+=
insize
;
...
@@ -341,44 +341,46 @@ done:
...
@@ -341,44 +341,46 @@ done:
unsigned
uncomp
=
size
;
unsigned
uncomp
=
size
;
xwrite
(
fd
,
&
uncomp
,
sizeof
(
uncomp
));
xwrite
(
fd
,
&
uncomp
,
sizeof
(
uncomp
));
}
}
free
(
out
)
;
delete
[]
out
;
return
total
;
return
total
;
}
}
long
long
decomp
(
format_t
type
,
int
to
,
const
void
*
from
,
size_t
size
)
{
long
long
decompress
(
format_t
type
,
int
fd
,
const
void
*
from
,
size_t
size
)
{
const
uint8_t
*
buf
=
(
uint8_t
*
)
from
;
switch
(
type
)
{
switch
(
type
)
{
case
GZIP
:
case
GZIP
:
return
gzip
(
0
,
to
,
from
,
size
);
return
gzip
(
0
,
fd
,
buf
,
size
);
case
XZ
:
case
XZ
:
return
lzma
(
0
,
to
,
from
,
size
);
return
lzma
(
0
,
fd
,
buf
,
size
);
case
LZMA
:
case
LZMA
:
return
lzma
(
0
,
to
,
from
,
size
);
return
lzma
(
0
,
fd
,
buf
,
size
);
case
BZIP2
:
case
BZIP2
:
return
bzip2
(
0
,
to
,
from
,
size
);
return
bzip2
(
0
,
fd
,
buf
,
size
);
case
LZ4
:
case
LZ4
:
return
lz4
(
0
,
to
,
from
,
size
);
return
lz4
(
0
,
fd
,
buf
,
size
);
case
LZ4_LEGACY
:
case
LZ4_LEGACY
:
return
lz4_legacy
(
0
,
to
,
from
,
size
);
return
lz4_legacy
(
0
,
fd
,
buf
,
size
);
default:
default:
// Unsupported
// Unsupported
return
-
1
;
return
-
1
;
}
}
}
}
long
long
comp
(
format_t
type
,
int
to
,
const
void
*
from
,
size_t
size
)
{
long
long
compress
(
format_t
type
,
int
fd
,
const
void
*
from
,
size_t
size
)
{
const
uint8_t
*
buf
=
(
uint8_t
*
)
from
;
switch
(
type
)
{
switch
(
type
)
{
case
GZIP
:
case
GZIP
:
return
gzip
(
1
,
to
,
from
,
size
);
return
gzip
(
1
,
fd
,
buf
,
size
);
case
XZ
:
case
XZ
:
return
lzma
(
1
,
to
,
from
,
size
);
return
lzma
(
1
,
fd
,
buf
,
size
);
case
LZMA
:
case
LZMA
:
return
lzma
(
2
,
to
,
from
,
size
);
return
lzma
(
2
,
fd
,
buf
,
size
);
case
BZIP2
:
case
BZIP2
:
return
bzip2
(
1
,
to
,
from
,
size
);
return
bzip2
(
1
,
fd
,
buf
,
size
);
case
LZ4
:
case
LZ4
:
return
lz4
(
1
,
to
,
from
,
size
);
return
lz4
(
1
,
fd
,
buf
,
size
);
case
LZ4_LEGACY
:
case
LZ4_LEGACY
:
return
lz4_legacy
(
1
,
to
,
from
,
size
);
return
lz4_legacy
(
1
,
fd
,
buf
,
size
);
default:
default:
// Unsupported
// Unsupported
return
-
1
;
return
-
1
;
...
@@ -389,7 +391,7 @@ long long comp(format_t type, int to, const void *from, size_t size) {
...
@@ -389,7 +391,7 @@ long long comp(format_t type, int to, const void *from, size_t size) {
* Below are utility functions for commandline
* Below are utility functions for commandline
*/
*/
void
decomp
_file
(
char
*
from
,
const
char
*
to
)
{
void
decomp
ress
(
char
*
from
,
const
char
*
to
)
{
int
strip
=
1
;
int
strip
=
1
;
void
*
file
;
void
*
file
;
size_t
size
=
0
;
size_t
size
=
0
;
...
@@ -400,9 +402,9 @@ void decomp_file(char *from, const char *to) {
...
@@ -400,9 +402,9 @@ void decomp_file(char *from, const char *to) {
format_t
type
=
check_fmt
(
file
,
size
);
format_t
type
=
check_fmt
(
file
,
size
);
char
*
ext
;
char
*
ext
;
ext
=
strrchr
(
from
,
'.'
);
ext
=
strrchr
(
from
,
'.'
);
if
(
to
==
NULL
)
if
(
to
==
nullptr
)
to
=
from
;
to
=
from
;
if
(
ext
!=
NULL
)
{
if
(
ext
!=
nullptr
)
{
// Strip out a matched file extension
// Strip out a matched file extension
switch
(
type
)
{
switch
(
type
)
{
case
GZIP
:
case
GZIP
:
...
@@ -442,9 +444,9 @@ void decomp_file(char *from, const char *to) {
...
@@ -442,9 +444,9 @@ void decomp_file(char *from, const char *to) {
fprintf
(
stderr
,
"Decompressing to [%s]
\n
"
,
to
);
fprintf
(
stderr
,
"Decompressing to [%s]
\n
"
,
to
);
}
}
decomp
(
type
,
fd
,
file
,
size
);
decomp
ress
(
type
,
fd
,
file
,
size
);
close
(
fd
);
close
(
fd
);
if
(
to
==
from
&&
ext
!=
NULL
)
{
if
(
to
==
from
&&
ext
!=
nullptr
)
{
*
ext
=
'.'
;
*
ext
=
'.'
;
unlink
(
from
);
unlink
(
from
);
}
}
...
@@ -454,9 +456,10 @@ void decomp_file(char *from, const char *to) {
...
@@ -454,9 +456,10 @@ void decomp_file(char *from, const char *to) {
munmap
(
file
,
size
);
munmap
(
file
,
size
);
}
}
void
comp
_file
(
const
char
*
method
,
const
char
*
from
,
const
char
*
to
)
{
void
comp
ress
(
const
char
*
method
,
const
char
*
from
,
const
char
*
to
)
{
format_t
type
;
format_t
type
;
char
*
ext
,
dest
[
PATH_MAX
];
const
char
*
ext
;
char
dest
[
PATH_MAX
];
if
(
strcmp
(
method
,
"gzip"
)
==
0
)
{
if
(
strcmp
(
method
,
"gzip"
)
==
0
)
{
type
=
GZIP
;
type
=
GZIP
;
ext
=
"gz"
;
ext
=
"gz"
;
...
@@ -488,7 +491,7 @@ void comp_file(const char *method, const char *from, const char *to) {
...
@@ -488,7 +491,7 @@ void comp_file(const char *method, const char *from, const char *to) {
stream_full_read
(
STDIN_FILENO
,
&
file
,
&
size
);
stream_full_read
(
STDIN_FILENO
,
&
file
,
&
size
);
else
else
mmap_ro
(
from
,
&
file
,
&
size
);
mmap_ro
(
from
,
&
file
,
&
size
);
if
(
to
==
NULL
)
{
if
(
to
==
nullptr
)
{
if
(
strcmp
(
from
,
"-"
)
==
0
)
if
(
strcmp
(
from
,
"-"
)
==
0
)
strcpy
(
dest
,
"-"
);
strcpy
(
dest
,
"-"
);
else
else
...
@@ -502,13 +505,13 @@ void comp_file(const char *method, const char *from, const char *to) {
...
@@ -502,13 +505,13 @@ void comp_file(const char *method, const char *from, const char *to) {
fd
=
creat
(
dest
,
0644
);
fd
=
creat
(
dest
,
0644
);
fprintf
(
stderr
,
"Compressing to [%s]
\n
"
,
dest
);
fprintf
(
stderr
,
"Compressing to [%s]
\n
"
,
dest
);
}
}
comp
(
type
,
fd
,
file
,
size
);
comp
ress
(
type
,
fd
,
file
,
size
);
close
(
fd
);
close
(
fd
);
if
(
strcmp
(
from
,
"-"
)
==
0
)
if
(
strcmp
(
from
,
"-"
)
==
0
)
free
(
file
);
free
(
file
);
else
else
munmap
(
file
,
size
);
munmap
(
file
,
size
);
if
(
to
==
NULL
)
if
(
to
==
nullptr
)
unlink
(
from
);
unlink
(
from
);
}
}
native/jni/magiskboot/cpio.c
→
native/jni/magiskboot/cpio.c
pp
View file @
fc8a3c5f
#include <stdio.h>
#include <unistd.h>
#include <unistd.h>
#include <fcntl.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <string.h>
#include <stdlib.h>
#include "cpio.h"
#include "cpio.h"
#include "logging.h"
#include "utils.h"
#include "utils.h"
#include "logging.h"
#define parse_align() lseek(fd, align(lseek(fd, 0, SEEK_CUR), 4), SEEK_SET)
static
uint32_t
x8u
(
char
*
hex
)
{
static
uint32_t
x8u
(
char
*
hex
)
{
uint32_t
val
,
inpos
=
8
,
outpos
;
uint32_t
val
,
inpos
=
8
,
outpos
;
...
@@ -19,98 +20,84 @@ static uint32_t x8u(char *hex) {
...
@@ -19,98 +20,84 @@ static uint32_t x8u(char *hex) {
// Because scanf gratuitously treats %*X differently than printf does.
// Because scanf gratuitously treats %*X differently than printf does.
sprintf
(
pattern
,
"%%%dx%%n"
,
inpos
);
sprintf
(
pattern
,
"%%%dx%%n"
,
inpos
);
sscanf
(
hex
,
pattern
,
&
val
,
&
outpos
);
sscanf
(
hex
,
pattern
,
&
val
,
&
outpos
);
if
(
inpos
!=
outpos
)
LOGE
(
"bad cpio header
\n
"
);
if
(
inpos
!=
outpos
)
LOGE
(
"bad cpio header
\n
"
);
return
val
;
return
val
;
}
}
void
cpio_free
(
cpio_entry
*
e
)
{
cpio_entry
::
cpio_entry
(
int
fd
,
cpio_newc_header
&
header
)
{
if
(
e
)
{
// ino = x8u(header.ino);
free
(
e
->
filename
);
mode
=
x8u
(
header
.
mode
);
free
(
e
->
data
);
uid
=
x8u
(
header
.
uid
);
free
(
e
);
gid
=
x8u
(
header
.
gid
);
// nlink = x8u(header.nlink);
// mtime = x8u(header.mtime);
filesize
=
x8u
(
header
.
filesize
);
// devmajor = x8u(header.devmajor);
// devminor = x8u(header.devminor);
// rdevmajor = x8u(header.rdevmajor);
// rdevminor = x8u(header.rdevminor);
uint32_t
namesize
=
x8u
(
header
.
namesize
);
// check = x8u(header.check);
filename
=
(
char
*
)
xmalloc
(
namesize
);
xxread
(
fd
,
filename
,
namesize
);
parse_align
();
if
(
filesize
)
{
data
=
xmalloc
(
filesize
);
xxread
(
fd
,
data
,
filesize
);
parse_align
();
}
}
}
}
int
cpio_find
(
struct
vector
*
v
,
const
char
*
entry
)
{
cpio_entry
::~
cpio_entry
()
{
cpio_entry
*
e
;
free
(
filename
);
vec_for_each
(
v
,
e
)
{
free
(
data
);
if
(
!
e
)
continue
;
if
(
strcmp
(
e
->
filename
,
entry
)
==
0
)
return
_
;
}
return
-
1
;
}
}
int
cpio_cmp
(
const
void
*
a
,
const
void
*
b
)
{
// Define the way to sort cpio_entry
return
strcmp
(((
cpio_entry
*
)
a
)
->
filename
,
((
cpio_entry
*
)
b
)
->
filename
);
template
<>
}
int
(
*
Array
<
cpio_entry
*>::
_cmp
)(
cpio_entry
*&
,
cpio_entry
*&
)
=
[](
auto
a
,
auto
b
)
->
int
{
if
(
a
==
b
)
return
0
;
if
(
a
==
nullptr
)
return
1
;
if
(
b
==
nullptr
)
return
-
1
;
return
strcmp
(
a
->
filename
,
b
->
filename
);
};
void
cpio_vec_insert
(
struct
vector
*
v
,
cpio_entry
*
n
)
{
int
i
=
cpio_find
(
v
,
n
->
filename
);
if
(
i
>=
0
)
{
// Replace, then all is done
cpio_free
(
vec_entry
(
v
)[
i
]);
vec_entry
(
v
)[
i
]
=
n
;
return
;
}
vec_push_back
(
v
,
n
);
}
// Parse cpio file to a vector of cpio_entry
cpio
::
cpio
(
const
char
*
filename
)
{
#define parse_align() lseek(fd, align(lseek(fd, 0, SEEK_CUR), 4), SEEK_SET)
void
parse_cpio
(
struct
vector
*
v
,
const
char
*
filename
)
{
int
fd
=
open
(
filename
,
O_RDONLY
);
int
fd
=
open
(
filename
,
O_RDONLY
);
if
(
fd
<
0
)
return
;
if
(
fd
<
0
)
return
;
fprintf
(
stderr
,
"Loading cpio: [%s]
\n
"
,
filename
);
fprintf
(
stderr
,
"Loading cpio: [%s]
\n
"
,
filename
);
cpio_newc_header
header
;
cpio_newc_header
header
;
cpio_entry
*
f
;
cpio_entry
*
entry
;
while
(
xxread
(
fd
,
&
header
,
110
)
!=
-
1
)
{
while
(
xxread
(
fd
,
&
header
,
sizeof
(
cpio_newc_header
))
!=
-
1
)
{
f
=
xcalloc
(
sizeof
(
*
f
),
1
);
entry
=
new
cpio_entry
(
fd
,
header
);
// f->ino = x8u(header.ino);
if
(
strcmp
(
entry
->
filename
,
"."
)
==
0
||
strcmp
(
entry
->
filename
,
".."
)
==
0
||
f
->
mode
=
x8u
(
header
.
mode
);
strcmp
(
entry
->
filename
,
"TRAILER!!!"
)
==
0
)
{
f
->
uid
=
x8u
(
header
.
uid
);
delete
entry
;
f
->
gid
=
x8u
(
header
.
gid
);
if
(
entry
->
filename
[
0
]
==
'T'
)
// f->nlink = x8u(header.nlink);
// f->mtime = x8u(header.mtime);
f
->
filesize
=
x8u
(
header
.
filesize
);
// f->devmajor = x8u(header.devmajor);
// f->devminor = x8u(header.devminor);
// f->rdevmajor = x8u(header.rdevmajor);
// f->rdevminor = x8u(header.rdevminor);
uint32_t
namesize
=
x8u
(
header
.
namesize
);
// f->check = x8u(header.check);
f
->
filename
=
xmalloc
(
namesize
);
xxread
(
fd
,
f
->
filename
,
namesize
);
parse_align
();
if
(
strcmp
(
f
->
filename
,
"."
)
==
0
||
strcmp
(
f
->
filename
,
".."
)
==
0
)
{
cpio_free
(
f
);
continue
;
}
if
(
strcmp
(
f
->
filename
,
"TRAILER!!!"
)
==
0
)
{
cpio_free
(
f
);
break
;
break
;
continue
;
}
}
if
(
f
->
filesize
)
{
arr
.
push_back
(
entry
);
f
->
data
=
xmalloc
(
f
->
filesize
);
xxread
(
fd
,
f
->
data
,
f
->
filesize
);
parse_align
();
}
vec_push_back
(
v
,
f
);
}
}
close
(
fd
);
close
(
fd
);
}
}
cpio
::~
cpio
()
{
for
(
auto
&
e
:
arr
)
if
(
e
)
delete
e
;
}
#define dump_align() write_zero(fd, align_off(lseek(fd, 0, SEEK_CUR), 4))
#define dump_align() write_zero(fd, align_off(lseek(fd, 0, SEEK_CUR), 4))
void
dump_cpio
(
struct
vector
*
v
,
const
char
*
filenam
e
)
{
void
cpio
::
dump
(
const
char
*
fil
e
)
{
fprintf
(
stderr
,
"Dump cpio: [%s]
\n
"
,
file
name
);
fprintf
(
stderr
,
"Dump cpio: [%s]
\n
"
,
file
);
unsigned
inode
=
300000
;
unsigned
inode
=
300000
;
char
header
[
111
];
char
header
[
111
];
// Sort by name
sort
();
vec_sort
(
v
,
cpio_cmp
);
int
fd
=
creat
(
file
,
0644
);
cpio_entry
*
e
;
for
(
auto
&
e
:
arr
)
{
int
fd
=
creat
(
filename
,
0644
);
vec_for_each
(
v
,
e
)
{
sprintf
(
header
,
"070701%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x"
,
sprintf
(
header
,
"070701%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x"
,
inode
++
,
// e->ino
inode
++
,
// e->ino
e
->
mode
,
e
->
mode
,
...
@@ -135,126 +122,151 @@ void dump_cpio(struct vector *v, const char *filename) {
...
@@ -135,126 +122,151 @@ void dump_cpio(struct vector *v, const char *filename) {
}
}
}
}
// Write trailer
// Write trailer
sprintf
(
header
,
"070701%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x"
,
inode
++
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
11
,
0
);
sprintf
(
header
,
"070701%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x"
,
inode
++
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
11
,
0
);
xwrite
(
fd
,
header
,
110
);
xwrite
(
fd
,
header
,
110
);
xwrite
(
fd
,
"TRAILER!!!
\0
"
,
11
);
xwrite
(
fd
,
"TRAILER!!!
\0
"
,
11
);
dump_align
();
dump_align
();
close
(
fd
);
close
(
fd
);
}
}
void
cpio_vec_destroy
(
struct
vector
*
v
)
{
int
cpio
::
find
(
const
char
*
name
)
{
// Free each cpio_entry
for
(
int
i
=
0
;
i
<
arr
.
size
();
++
i
)
{
cpio_entry
*
e
;
if
(
!
arr
[
i
])
vec_for_each
(
v
,
e
)
continue
;
cpio_free
(
e
);
if
(
strcmp
(
arr
[
i
]
->
filename
,
name
)
==
0
)
vec_destroy
(
v
);
return
i
;
}
return
-
1
;
}
void
cpio
::
insert
(
cpio_entry
*
e
)
{
int
i
=
find
(
e
->
filename
);
if
(
i
>=
0
)
{
// Replace, then all is done
delete
arr
[
i
];
arr
[
i
]
=
e
;
return
;
}
arr
.
push_back
(
e
);
}
void
cpio
::
insert
(
Array
<
cpio_entry
*>
&
arr
)
{
for
(
auto
&
e
:
arr
)
insert
(
e
);
}
}
void
cpio
_rm
(
struct
vector
*
v
,
int
recursive
,
const
char
*
entry
)
{
void
cpio
::
rm
(
int
recur
,
const
char
*
name
)
{
cpio_entry
*
e
;
size_t
len
=
strlen
(
name
)
;
size_t
len
=
strlen
(
entry
);
for
(
auto
&
e
:
arr
)
{
vec_for_each
(
v
,
e
)
{
if
(
!
e
)
if
(
!
e
)
continue
;
continue
;
if
(
strncmp
(
e
->
filename
,
entry
,
len
)
==
0
)
{
if
(
strncmp
(
e
->
filename
,
name
,
len
)
==
0
&&
if
((
recursive
&&
e
->
filename
[
len
]
==
'/'
)
||
e
->
filename
[
len
]
==
'\0'
)
{
((
recur
&&
e
->
filename
[
len
]
==
'/'
)
||
e
->
filename
[
len
]
==
'\0'
)
)
{
fprintf
(
stderr
,
"Remove [%s]
\n
"
,
e
->
filename
);
fprintf
(
stderr
,
"Remove [%s]
\n
"
,
e
->
filename
);
cpio_free
(
e
)
;
delete
e
;
vec_cur
(
v
)
=
NULL
;
e
=
nullptr
;
if
(
!
recursive
)
return
;
if
(
!
recur
)
}
return
;
}
}
}
}
}
}
void
cpio
_mkdir
(
struct
vector
*
v
,
mode_t
mode
,
const
char
*
entry
)
{
void
cpio
::
makedir
(
mode_t
mode
,
const
char
*
name
)
{
cpio_entry
*
e
=
xcalloc
(
sizeof
(
*
e
),
1
);
auto
e
=
new
cpio_entry
(
);
e
->
mode
=
S_IFDIR
|
mode
;
e
->
mode
=
S_IFDIR
|
mode
;
e
->
filename
=
strdup
(
entry
);
e
->
filename
=
strdup
(
name
);
cpio_vec_insert
(
v
,
e
);
insert
(
e
);
fprintf
(
stderr
,
"Create directory [%s] (%04o)
\n
"
,
entry
,
mode
);
fprintf
(
stderr
,
"Create directory [%s] (%04o)
\n
"
,
name
,
mode
);
}
}
void
cpio
_ln
(
struct
vector
*
v
,
const
char
*
target
,
const
char
*
entry
)
{
void
cpio
::
ln
(
const
char
*
target
,
const
char
*
name
)
{
cpio_entry
*
e
=
xcalloc
(
sizeof
(
*
e
),
1
);
auto
e
=
new
cpio_entry
(
);
e
->
mode
=
S_IFLNK
;
e
->
mode
=
S_IFLNK
;
e
->
filename
=
strdup
(
entry
);
e
->
filename
=
strdup
(
name
);
e
->
filesize
=
strlen
(
target
);
e
->
filesize
=
strlen
(
target
);
e
->
data
=
strdup
(
target
);
e
->
data
=
strdup
(
target
);
cpio_vec_insert
(
v
,
e
);
insert
(
e
);
fprintf
(
stderr
,
"Create symlink [%s] -> [%s]
\n
"
,
entry
,
target
);
fprintf
(
stderr
,
"Create symlink [%s] -> [%s]
\n
"
,
name
,
target
);
}
}
void
cpio
_add
(
struct
vector
*
v
,
mode_t
mode
,
const
char
*
entry
,
const
char
*
filenam
e
)
{
void
cpio
::
add
(
mode_t
mode
,
const
char
*
name
,
const
char
*
fil
e
)
{
int
fd
=
xopen
(
file
name
,
O_RDONLY
);
int
fd
=
xopen
(
file
,
O_RDONLY
);
cpio_entry
*
e
=
xcalloc
(
sizeof
(
*
e
),
1
);
auto
e
=
new
cpio_entry
(
);
e
->
mode
=
S_IFREG
|
mode
;
e
->
mode
=
S_IFREG
|
mode
;
e
->
filename
=
strdup
(
entry
);
e
->
filename
=
strdup
(
name
);
e
->
filesize
=
lseek
(
fd
,
0
,
SEEK_END
);
e
->
filesize
=
lseek
(
fd
,
0
,
SEEK_END
);
lseek
(
fd
,
0
,
SEEK_SET
);
lseek
(
fd
,
0
,
SEEK_SET
);
e
->
data
=
xmalloc
(
e
->
filesize
);
e
->
data
=
xmalloc
(
e
->
filesize
);
xxread
(
fd
,
e
->
data
,
e
->
filesize
);
xxread
(
fd
,
e
->
data
,
e
->
filesize
);
close
(
fd
);
close
(
fd
);
cpio_vec_insert
(
v
,
e
);
insert
(
e
);
fprintf
(
stderr
,
"Add entry [%s] (%04o)
\n
"
,
entry
,
mode
);
fprintf
(
stderr
,
"Add entry [%s] (%04o)
\n
"
,
name
,
mode
);
}
}
int
cpio_mv
(
struct
vector
*
v
,
const
char
*
from
,
const
char
*
to
)
{
bool
cpio
::
mv
(
const
char
*
from
,
const
char
*
to
)
{
struct
cpio_entry
*
e
;
int
f
=
find
(
from
),
t
=
find
(
to
);
int
f
=
cpio_find
(
v
,
from
),
t
=
cpio_find
(
v
,
to
);
if
(
f
>=
0
)
{
if
(
f
>
0
)
{
if
(
t
>
0
)
{
if
(
t
>
0
)
{
cpio_free
(
vec_entry
(
v
)[
t
])
;
delete
arr
[
t
]
;
vec_entry
(
v
)[
t
]
=
NULL
;
arr
[
t
]
=
nullptr
;
}
}
e
=
vec_entry
(
v
)[
f
]
;
free
(
arr
[
f
]
->
filename
)
;
free
(
e
->
filename
);
arr
[
f
]
->
filename
=
strdup
(
to
);
e
->
filename
=
strdup
(
to
);
fprintf
(
stderr
,
"Move [%s] -> [%s]
\n
"
,
from
,
to
);
return
0
;
return
true
;
}
}
fprintf
(
stderr
,
"Cannot find entry %s
\n
"
,
from
);
fprintf
(
stderr
,
"Cannot find entry %s
\n
"
,
from
);
return
1
;
return
false
;
}
}
int
cpio_extract
(
struct
vector
*
v
,
const
char
*
entry
,
const
char
*
filename
)
{
void
cpio
::
extract
()
{
int
i
=
cpio_find
(
v
,
entry
);
for
(
auto
&
e
:
arr
)
{
if
(
i
>
0
)
{
if
(
!
e
)
cpio_entry
*
e
=
vec_entry
(
v
)[
i
];
continue
;
fprintf
(
stderr
,
"Extracting [%s] to [%s]
\n
"
,
entry
,
filename
);
fprintf
(
stderr
,
"Extract [%s]
\n
"
,
e
->
filename
);
if
(
S_ISREG
(
e
->
mode
))
{
unlink
(
e
->
filename
);
int
fd
=
creat
(
filename
,
e
->
mode
&
0777
);
rmdir
(
e
->
filename
);
if
(
S_ISDIR
(
e
->
mode
))
{
mkdir
(
e
->
filename
,
e
->
mode
&
0777
);
}
else
if
(
S_ISREG
(
e
->
mode
))
{
int
fd
=
creat
(
e
->
filename
,
e
->
mode
&
0777
);
xwrite
(
fd
,
e
->
data
,
e
->
filesize
);
xwrite
(
fd
,
e
->
data
,
e
->
filesize
);
fchown
(
fd
,
e
->
uid
,
e
->
gid
);
fchown
(
fd
,
e
->
uid
,
e
->
gid
);
close
(
fd
);
close
(
fd
);
}
else
if
(
S_ISLNK
(
e
->
mode
))
{
}
else
if
(
S_ISLNK
(
e
->
mode
))
{
char
*
target
=
xcalloc
(
e
->
filesize
+
1
,
1
)
;
char
*
target
=
new
char
[
e
->
filesize
+
1
]
;
memcpy
(
target
,
e
->
data
,
e
->
filesize
);
memcpy
(
target
,
e
->
data
,
e
->
filesize
);
unlink
(
filename
);
symlink
(
target
,
e
->
filename
);
symlink
(
target
,
filename
)
;
delete
[]
target
;
}
}
return
0
;
}
}
fprintf
(
stderr
,
"Cannot find the file entry [%s]
\n
"
,
entry
);
return
1
;
}
}
void
cpio_extract_all
(
struct
vector
*
v
)
{
bool
cpio
::
extract
(
const
char
*
name
,
const
char
*
file
)
{
cpio_entry
*
e
;
int
i
=
find
(
name
);
vec_for_each
(
v
,
e
)
{
if
(
i
>
0
)
{
if
(
!
e
)
continue
;
auto
e
=
arr
[
i
];
fprintf
(
stderr
,
"Extracting [%s]
\n
"
,
e
->
filename
);
fprintf
(
stderr
,
"Extract [%s] to [%s]
\n
"
,
name
,
file
);
unlink
(
e
->
filename
);
if
(
S_ISREG
(
e
->
mode
))
{
rmdir
(
e
->
filename
);
int
fd
=
creat
(
file
,
e
->
mode
&
0777
);
if
(
S_ISDIR
(
e
->
mode
))
{
mkdir
(
e
->
filename
,
e
->
mode
&
0777
);
}
else
if
(
S_ISREG
(
e
->
mode
))
{
int
fd
=
creat
(
e
->
filename
,
e
->
mode
&
0777
);
xwrite
(
fd
,
e
->
data
,
e
->
filesize
);
xwrite
(
fd
,
e
->
data
,
e
->
filesize
);
fchown
(
fd
,
e
->
uid
,
e
->
gid
);
fchown
(
fd
,
e
->
uid
,
e
->
gid
);
close
(
fd
);
close
(
fd
);
}
else
if
(
S_ISLNK
(
e
->
mode
))
{
}
else
if
(
S_ISLNK
(
e
->
mode
))
{
char
*
target
=
xcalloc
(
e
->
filesize
+
1
,
1
)
;
char
*
target
=
new
char
[
e
->
filesize
+
1
]
;
memcpy
(
target
,
e
->
data
,
e
->
filesize
);
memcpy
(
target
,
e
->
data
,
e
->
filesize
);
symlink
(
target
,
e
->
filename
);
symlink
(
target
,
e
->
filename
);
delete
[]
target
;
}
}
return
true
;
}
}
fprintf
(
stderr
,
"Cannot find the file entry [%s]
\n
"
,
name
);
return
false
;
}
void
cpio
::
sort
()
{
arr
.
sort
();
while
(
arr
.
back
()
==
nullptr
)
arr
.
pop_back
();
}
}
native/jni/magiskboot/cpio.h
View file @
fc8a3c5f
...
@@ -3,9 +3,26 @@
...
@@ -3,9 +3,26 @@
#include <stdint.h>
#include <stdint.h>
#include "
vector
.h"
#include "
array
.h"
typedef
struct
cpio_entry
{
struct
cpio_newc_header
{
char
magic
[
6
];
char
ino
[
8
];
char
mode
[
8
];
char
uid
[
8
];
char
gid
[
8
];
char
nlink
[
8
];
char
mtime
[
8
];
char
filesize
[
8
];
char
devmajor
[
8
];
char
devminor
[
8
];
char
rdevmajor
[
8
];
char
rdevminor
[
8
];
char
namesize
[
8
];
char
check
[
8
];
}
__attribute__
((
packed
));
struct
cpio_entry
{
// uint32_t ino;
// uint32_t ino;
uint32_t
mode
;
uint32_t
mode
;
uint32_t
uid
;
uint32_t
uid
;
...
@@ -21,40 +38,31 @@ typedef struct cpio_entry {
...
@@ -21,40 +38,31 @@ typedef struct cpio_entry {
// uint32_t check;
// uint32_t check;
char
*
filename
;
char
*
filename
;
void
*
data
;
void
*
data
;
int
remove
;
}
cpio_entry
;
typedef
struct
cpio_newc_header
{
cpio_entry
()
{}
char
magic
[
6
];
cpio_entry
(
int
fd
,
cpio_newc_header
&
header
);
char
ino
[
8
];
~
cpio_entry
();
char
mode
[
8
];
};
char
uid
[
8
];
char
gid
[
8
];
class
cpio
{
char
nlink
[
8
];
public
:
char
mtime
[
8
];
cpio
(
const
char
*
filename
);
char
filesize
[
8
];
~
cpio
();
char
devmajor
[
8
];
void
dump
(
const
char
*
file
);
char
devminor
[
8
];
int
find
(
const
char
*
name
);
char
rdevmajor
[
8
];
void
insert
(
cpio_entry
*
e
);
char
rdevminor
[
8
];
void
rm
(
int
recur
,
const
char
*
name
);
char
namesize
[
8
];
void
makedir
(
mode_t
mode
,
const
char
*
name
);
char
check
[
8
];
void
ln
(
const
char
*
target
,
const
char
*
name
);
}
cpio_newc_header
;
void
add
(
mode_t
mode
,
const
char
*
name
,
const
char
*
file
);
void
insert
(
Array
<
cpio_entry
*>
&
arr
);
// Basic cpio functions
bool
mv
(
const
char
*
from
,
const
char
*
to
);
void
cpio_free
(
cpio_entry
*
e
);
void
extract
();
int
cpio_find
(
struct
vector
*
v
,
const
char
*
entry
);
bool
extract
(
const
char
*
name
,
const
char
*
file
);
int
cpio_cmp
(
const
void
*
a
,
const
void
*
b
);
void
sort
();
void
parse_cpio
(
struct
vector
*
v
,
const
char
*
filename
);
void
dump_cpio
(
struct
vector
*
v
,
const
char
*
filename
);
protected
:
void
cpio_vec_insert
(
struct
vector
*
v
,
cpio_entry
*
n
);
Array
<
cpio_entry
*>
arr
;
void
cpio_vec_destroy
(
struct
vector
*
v
);
};
void
cpio_rm
(
struct
vector
*
v
,
int
recursive
,
const
char
*
entry
);
void
cpio_mkdir
(
struct
vector
*
v
,
mode_t
mode
,
const
char
*
entry
);
void
cpio_ln
(
struct
vector
*
v
,
const
char
*
target
,
const
char
*
entry
);
void
cpio_add
(
struct
vector
*
v
,
mode_t
mode
,
const
char
*
entry
,
const
char
*
filename
);
int
cpio_mv
(
struct
vector
*
v
,
const
char
*
from
,
const
char
*
to
);
int
cpio_extract
(
struct
vector
*
v
,
const
char
*
entry
,
const
char
*
filename
);
void
cpio_extract_all
(
struct
vector
*
v
);
#endif
#endif
native/jni/magiskboot/dtb.c
→
native/jni/magiskboot/dtb.c
pp
View file @
fc8a3c5f
#include <libfdt.h>
#include <unistd.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/mman.h>
extern
"C"
{
#include <libfdt.h>
}
#include "magiskboot.h"
#include "magiskboot.h"
#include "utils.h"
#include "utils.h"
...
@@ -12,7 +14,7 @@ static void print_props(const void *fdt, int node, int depth) {
...
@@ -12,7 +14,7 @@ static void print_props(const void *fdt, int node, int depth) {
printf
(
" "
);
printf
(
" "
);
int
size
;
int
size
;
const
char
*
name
;
const
char
*
name
;
const
char
*
value
=
fdt_getprop_by_offset
(
fdt
,
prop
,
&
name
,
&
size
);
const
char
*
value
=
(
char
*
)
fdt_getprop_by_offset
(
fdt
,
prop
,
&
name
,
&
size
);
printf
(
"[%s]: [%s]
\n
"
,
name
,
value
);
printf
(
"[%s]: [%s]
\n
"
,
name
,
value
);
}
}
}
}
...
@@ -41,9 +43,9 @@ static int find_fstab(const void *fdt, int parent) {
...
@@ -41,9 +43,9 @@ static int find_fstab(const void *fdt, int parent) {
static
void
dtb_dump
(
const
char
*
file
)
{
static
void
dtb_dump
(
const
char
*
file
)
{
size_t
size
;
size_t
size
;
void
*
dtb
,
*
fdt
;
uint8_t
*
dtb
,
*
fdt
;
fprintf
(
stderr
,
"Loading dtbs from [%s]
\n
"
,
file
);
fprintf
(
stderr
,
"Loading dtbs from [%s]
\n
"
,
file
);
mmap_ro
(
file
,
&
dtb
,
&
size
);
mmap_ro
(
file
,
(
void
**
)
&
dtb
,
&
size
);
// Loop through all the dtbs
// Loop through all the dtbs
int
dtb_num
=
0
;
int
dtb_num
=
0
;
for
(
int
i
=
0
;
i
<
size
;
++
i
)
{
for
(
int
i
=
0
;
i
<
size
;
++
i
)
{
...
@@ -60,12 +62,12 @@ static void dtb_dump(const char *file) {
...
@@ -60,12 +62,12 @@ static void dtb_dump(const char *file) {
static
void
dtb_patch
(
const
char
*
file
,
int
patch
)
{
static
void
dtb_patch
(
const
char
*
file
,
int
patch
)
{
size_t
size
;
size_t
size
;
void
*
dtb
,
*
fdt
;
uint8_t
*
dtb
,
*
fdt
;
fprintf
(
stderr
,
"Loading dtbs from [%s]
\n
"
,
file
);
fprintf
(
stderr
,
"Loading dtbs from [%s]
\n
"
,
file
);
if
(
patch
)
if
(
patch
)
mmap_rw
(
file
,
&
dtb
,
&
size
);
mmap_rw
(
file
,
(
void
**
)
&
dtb
,
&
size
);
else
else
mmap_ro
(
file
,
&
dtb
,
&
size
);
mmap_ro
(
file
,
(
void
**
)
&
dtb
,
&
size
);
// Loop through all the dtbs
// Loop through all the dtbs
int
dtb_num
=
0
,
found
=
0
;
int
dtb_num
=
0
,
found
=
0
;
for
(
int
i
=
0
;
i
<
size
;
++
i
)
{
for
(
int
i
=
0
;
i
<
size
;
++
i
)
{
...
...
native/jni/magiskboot/format.c
→
native/jni/magiskboot/format.c
pp
View file @
fc8a3c5f
...
@@ -42,7 +42,7 @@ format_t check_fmt(const void *buf, size_t len) {
...
@@ -42,7 +42,7 @@ format_t check_fmt(const void *buf, size_t len) {
}
}
void
get_fmt_name
(
format_t
fmt
,
char
*
name
)
{
void
get_fmt_name
(
format_t
fmt
,
char
*
name
)
{
char
*
s
;
c
onst
c
har
*
s
;
switch
(
fmt
)
{
switch
(
fmt
)
{
case
CHROMEOS
:
case
CHROMEOS
:
s
=
"chromeos"
;
s
=
"chromeos"
;
...
...
native/jni/magiskboot/format.h
View file @
fc8a3c5f
...
@@ -44,8 +44,8 @@ typedef enum {
...
@@ -44,8 +44,8 @@ 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 ((char *[]) { "gzip", "xz", "lzma", "bzip2", "lz4", "lz4_legacy", NULL })
#define SUP_LIST ((c
onst c
har *[]) { "gzip", "xz", "lzma", "bzip2", "lz4", "lz4_legacy", NULL })
#define SUP_EXT_LIST ((char *[]) { "gz", "xz", "lzma", "bz2", "lz4", "lz4", NULL })
#define SUP_EXT_LIST ((c
onst c
har *[]) { "gz", "xz", "lzma", "bz2", "lz4", "lz4", NULL })
format_t
check_fmt
(
const
void
*
buf
,
size_t
len
);
format_t
check_fmt
(
const
void
*
buf
,
size_t
len
);
void
get_fmt_name
(
format_t
fmt
,
char
*
name
);
void
get_fmt_name
(
format_t
fmt
,
char
*
name
);
...
...
native/jni/magiskboot/hexpatch.c
→
native/jni/magiskboot/hexpatch.c
pp
View file @
fc8a3c5f
...
@@ -6,9 +6,9 @@
...
@@ -6,9 +6,9 @@
#include "magiskboot.h"
#include "magiskboot.h"
#include "utils.h"
#include "utils.h"
static
void
hex2byte
(
const
char
*
hex
,
unsigned
char
*
str
)
{
static
void
hex2byte
(
uint8_t
*
hex
,
uint8_t
*
str
)
{
char
high
,
low
;
char
high
,
low
;
for
(
int
i
=
0
,
length
=
strlen
(
hex
);
i
<
length
;
i
+=
2
)
{
for
(
int
i
=
0
,
length
=
strlen
(
(
char
*
)
hex
);
i
<
length
;
i
+=
2
)
{
high
=
toupper
(
hex
[
i
])
-
'0'
;
high
=
toupper
(
hex
[
i
])
-
'0'
;
low
=
toupper
(
hex
[
i
+
1
])
-
'0'
;
low
=
toupper
(
hex
[
i
+
1
])
-
'0'
;
str
[
i
/
2
]
=
((
high
>
9
?
high
-
7
:
high
)
<<
4
)
+
(
low
>
9
?
low
-
7
:
low
);
str
[
i
/
2
]
=
((
high
>
9
?
high
-
7
:
high
)
<<
4
)
+
(
low
>
9
?
low
-
7
:
low
);
...
@@ -18,12 +18,12 @@ static void hex2byte(const char *hex, unsigned char *str) {
...
@@ -18,12 +18,12 @@ static void hex2byte(const char *hex, unsigned char *str) {
void
hexpatch
(
const
char
*
image
,
const
char
*
from
,
const
char
*
to
)
{
void
hexpatch
(
const
char
*
image
,
const
char
*
from
,
const
char
*
to
)
{
int
patternsize
=
strlen
(
from
)
/
2
,
patchsize
=
strlen
(
to
)
/
2
;
int
patternsize
=
strlen
(
from
)
/
2
,
patchsize
=
strlen
(
to
)
/
2
;
size_t
filesize
;
size_t
filesize
;
void
*
file
,
*
pattern
,
*
patch
;
uint8_t
*
file
,
*
pattern
,
*
patch
;
mmap_rw
(
image
,
&
file
,
&
filesize
);
mmap_rw
(
image
,
(
void
**
)
&
file
,
&
filesize
);
pattern
=
xmalloc
(
patternsize
);
pattern
=
(
uint8_t
*
)
xmalloc
(
patternsize
);
patch
=
xmalloc
(
patchsize
);
patch
=
(
uint8_t
*
)
xmalloc
(
patchsize
);
hex2byte
(
from
,
pattern
);
hex2byte
(
(
uint8_t
*
)
from
,
pattern
);
hex2byte
(
to
,
patch
);
hex2byte
(
(
uint8_t
*
)
to
,
patch
);
for
(
size_t
i
=
0
;
filesize
>
0
&&
i
<
filesize
-
patternsize
;
++
i
)
{
for
(
size_t
i
=
0
;
filesize
>
0
&&
i
<
filesize
-
patternsize
;
++
i
)
{
if
(
memcmp
(
file
+
i
,
pattern
,
patternsize
)
==
0
)
{
if
(
memcmp
(
file
+
i
,
pattern
,
patternsize
)
==
0
)
{
fprintf
(
stderr
,
"Patch @ %08X [%s]->[%s]
\n
"
,
(
unsigned
)
i
,
from
,
to
);
fprintf
(
stderr
,
"Patch @ %08X [%s]->[%s]
\n
"
,
(
unsigned
)
i
,
from
,
to
);
...
...
native/jni/magiskboot/magiskboot.h
View file @
fc8a3c5f
...
@@ -3,7 +3,6 @@
...
@@ -3,7 +3,6 @@
#include <sys/types.h>
#include <sys/types.h>
#include "logging.h"
#include "format.h"
#include "format.h"
#define KERNEL_FILE "kernel"
#define KERNEL_FILE "kernel"
...
@@ -19,18 +18,18 @@ int unpack(const char *image);
...
@@ -19,18 +18,18 @@ int unpack(const char *image);
void
repack
(
const
char
*
orig_image
,
const
char
*
out_image
);
void
repack
(
const
char
*
orig_image
,
const
char
*
out_image
);
void
hexpatch
(
const
char
*
image
,
const
char
*
from
,
const
char
*
to
);
void
hexpatch
(
const
char
*
image
,
const
char
*
from
,
const
char
*
to
);
int
cpio_commands
(
int
argc
,
char
*
argv
[]);
int
cpio_commands
(
int
argc
,
char
*
argv
[]);
void
comp
_file
(
const
char
*
method
,
const
char
*
from
,
const
char
*
to
);
void
comp
ress
(
const
char
*
method
,
const
char
*
from
,
const
char
*
to
);
void
decomp
_file
(
char
*
from
,
const
char
*
to
);
void
decomp
ress
(
char
*
from
,
const
char
*
to
);
int
dtb_commands
(
const
char
*
cmd
,
int
argc
,
char
*
argv
[]);
int
dtb_commands
(
const
char
*
cmd
,
int
argc
,
char
*
argv
[]);
// Compressions
// Compressions
size_t
gzip
(
int
mode
,
int
fd
,
const
void
*
buf
,
size_t
size
);
size_t
gzip
(
int
mode
,
int
fd
,
const
void
*
buf
,
size_t
size
);
size_t
lzma
(
int
mode
,
int
fd
,
const
void
*
buf
,
size_t
size
);
size_t
lzma
(
int
mode
,
int
fd
,
const
void
*
buf
,
size_t
size
);
size_t
lz4
(
int
mode
,
int
fd
,
const
void
*
buf
,
size_t
size
);
size_t
lz4
(
int
mode
,
int
fd
,
const
uint8_t
*
buf
,
size_t
size
);
size_t
bzip2
(
int
mode
,
int
fd
,
const
void
*
buf
,
size_t
size
);
size_t
bzip2
(
int
mode
,
int
fd
,
const
void
*
buf
,
size_t
size
);
size_t
lz4_legacy
(
int
mode
,
int
fd
,
const
void
*
buf
,
size_t
size
);
size_t
lz4_legacy
(
int
mode
,
int
fd
,
const
uint8_t
*
buf
,
size_t
size
);
long
long
comp
(
format_t
type
,
int
to
,
const
void
*
from
,
size_t
size
);
long
long
comp
ress
(
format_t
type
,
int
fd
,
const
void
*
from
,
size_t
size
);
long
long
decomp
(
format_t
type
,
int
to
,
const
void
*
from
,
size_t
size
);
long
long
decomp
ress
(
format_t
type
,
int
fd
,
const
void
*
from
,
size_t
size
);
// Pattern
// Pattern
int
patch_verity
(
void
**
buf
,
uint32_t
*
size
,
int
patch
);
int
patch_verity
(
void
**
buf
,
uint32_t
*
size
,
int
patch
);
...
...
native/jni/magiskboot/main.c
→
native/jni/magiskboot/main.c
pp
View file @
fc8a3c5f
...
@@ -4,9 +4,11 @@
...
@@ -4,9 +4,11 @@
#include <unistd.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/mman.h>
#include <mincrypt/sha.h>
#include "magiskboot.h"
#include "magiskboot.h"
#include "logging.h"
#include "utils.h"
#include "utils.h"
#include "mincrypt/sha.h"
/********************
/********************
Patch Boot Image
Patch Boot Image
...
@@ -107,6 +109,7 @@ static void usage(char *arg0) {
...
@@ -107,6 +109,7 @@ static void usage(char *arg0) {
}
}
int
main
(
int
argc
,
char
*
argv
[])
{
int
main
(
int
argc
,
char
*
argv
[])
{
cmdline_logging
();
fprintf
(
stderr
,
"MagiskBoot v"
xstr
(
MAGISK_VERSION
)
"("
xstr
(
MAGISK_VER_CODE
)
") (by topjohnwu) - Boot Image Modification Tool
\n
"
);
fprintf
(
stderr
,
"MagiskBoot v"
xstr
(
MAGISK_VERSION
)
"("
xstr
(
MAGISK_VER_CODE
)
") (by topjohnwu) - Boot Image Modification Tool
\n
"
);
umask
(
0
);
umask
(
0
);
...
@@ -138,13 +141,13 @@ int main(int argc, char *argv[]) {
...
@@ -138,13 +141,13 @@ int main(int argc, char *argv[]) {
}
else
if
(
argc
>
2
&&
strcmp
(
argv
[
1
],
"--repack"
)
==
0
)
{
}
else
if
(
argc
>
2
&&
strcmp
(
argv
[
1
],
"--repack"
)
==
0
)
{
repack
(
argv
[
2
],
argc
>
3
?
argv
[
3
]
:
NEW_BOOT
);
repack
(
argv
[
2
],
argc
>
3
?
argv
[
3
]
:
NEW_BOOT
);
}
else
if
(
argc
>
2
&&
strcmp
(
argv
[
1
],
"--decompress"
)
==
0
)
{
}
else
if
(
argc
>
2
&&
strcmp
(
argv
[
1
],
"--decompress"
)
==
0
)
{
decomp
_file
(
argv
[
2
],
argc
>
3
?
argv
[
3
]
:
NULL
);
decomp
ress
(
argv
[
2
],
argc
>
3
?
argv
[
3
]
:
NULL
);
}
else
if
(
argc
>
2
&&
strncmp
(
argv
[
1
],
"--compress"
,
10
)
==
0
)
{
}
else
if
(
argc
>
2
&&
strncmp
(
argv
[
1
],
"--compress"
,
10
)
==
0
)
{
char
*
method
;
c
onst
c
har
*
method
;
method
=
strchr
(
argv
[
1
],
'='
);
method
=
strchr
(
argv
[
1
],
'='
);
if
(
method
==
NULL
)
method
=
"gzip"
;
if
(
method
==
NULL
)
method
=
"gzip"
;
else
method
++
;
else
method
++
;
comp
_file
(
method
,
argv
[
2
],
argc
>
3
?
argv
[
3
]
:
NULL
);
comp
ress
(
method
,
argv
[
2
],
argc
>
3
?
argv
[
3
]
:
NULL
);
}
else
if
(
argc
>
4
&&
strcmp
(
argv
[
1
],
"--hexpatch"
)
==
0
)
{
}
else
if
(
argc
>
4
&&
strcmp
(
argv
[
1
],
"--hexpatch"
)
==
0
)
{
hexpatch
(
argv
[
2
],
argv
[
3
],
argv
[
4
]);
hexpatch
(
argv
[
2
],
argv
[
3
],
argv
[
4
]);
}
else
if
(
argc
>
2
&&
strcmp
(
argv
[
1
],
"--cpio"
)
==
0
)
{
}
else
if
(
argc
>
2
&&
strcmp
(
argv
[
1
],
"--cpio"
)
==
0
)
{
...
...
native/jni/magiskboot/pattern.c
→
native/jni/magiskboot/pattern.c
pp
View file @
fc8a3c5f
#include <malloc.h>
#include <malloc.h>
#include <string.h>
#include <string.h>
#include "utils.h"
#include "magiskboot.h"
#include "magiskboot.h"
#include "utils.h"
static
int
check_verity_pattern
(
const
char
*
s
)
{
static
int
check_verity_pattern
(
const
char
*
s
)
{
int
skip
=
0
;
int
skip
=
0
;
...
@@ -32,7 +32,7 @@ static int check_encryption_pattern(const char *s) {
...
@@ -32,7 +32,7 @@ static int check_encryption_pattern(const char *s) {
int
patch_verity
(
void
**
buf
,
uint32_t
*
size
,
int
patch
)
{
int
patch_verity
(
void
**
buf
,
uint32_t
*
size
,
int
patch
)
{
int
skip
,
src_size
=
*
size
,
found
=
0
;
int
skip
,
src_size
=
*
size
,
found
=
0
;
char
*
src
=
*
buf
,
*
patched
=
patch
?
xcalloc
(
src_size
,
1
)
:
NULL
;
char
*
src
=
(
char
*
)
*
buf
,
*
patched
=
patch
?
(
char
*
)
xcalloc
(
src_size
,
1
)
:
nullptr
;
for
(
int
read
=
0
,
write
=
0
;
read
<
src_size
;
++
read
,
++
write
)
{
for
(
int
read
=
0
,
write
=
0
;
read
<
src_size
;
++
read
,
++
write
)
{
if
((
skip
=
check_verity_pattern
(
src
+
read
))
>
0
)
{
if
((
skip
=
check_verity_pattern
(
src
+
read
))
>
0
)
{
if
(
patch
)
{
if
(
patch
)
{
...
@@ -56,7 +56,7 @@ int patch_verity(void **buf, uint32_t *size, int patch) {
...
@@ -56,7 +56,7 @@ int patch_verity(void **buf, uint32_t *size, int patch) {
void
patch_encryption
(
void
**
buf
,
uint32_t
*
size
)
{
void
patch_encryption
(
void
**
buf
,
uint32_t
*
size
)
{
int
skip
,
src_size
=
*
size
;
int
skip
,
src_size
=
*
size
;
char
*
src
=
*
buf
,
*
patched
=
xcalloc
(
src_size
,
1
);
char
*
src
=
(
char
*
)
*
buf
,
*
patched
=
(
char
*
)
xcalloc
(
src_size
,
1
);
for
(
int
read
=
0
,
write
=
0
;
read
<
src_size
;
++
read
,
++
write
)
{
for
(
int
read
=
0
,
write
=
0
;
read
<
src_size
;
++
read
,
++
write
)
{
if
((
skip
=
check_encryption_pattern
(
src
+
read
))
>
0
)
{
if
((
skip
=
check_encryption_pattern
(
src
+
read
))
>
0
)
{
fprintf
(
stderr
,
"Replace pattern [%.*s] with [encryptable]
\n
"
,
skip
,
src
+
read
);
fprintf
(
stderr
,
"Replace pattern [%.*s] with [encryptable]
\n
"
,
skip
,
src
+
read
);
...
...
native/jni/magiskboot/ramdisk.c
→
native/jni/magiskboot/ramdisk.c
pp
View file @
fc8a3c5f
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <string.h>
#include <stdlib.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include "magiskboot.h"
#include "magiskboot.h"
#include "array.h"
#include "cpio.h"
#include "cpio.h"
#include "utils.h"
#include "utils.h"
static
void
cpio_patch
(
struct
vector
*
v
,
int
keepverity
,
int
keepforceencrypt
)
{
class
magisk_cpio
:
public
cpio
{
public
:
magisk_cpio
(
const
char
*
filename
)
:
cpio
(
filename
)
{}
void
patch
(
bool
keepverity
,
bool
keepforceencrypt
);
int
test
();
char
*
sha1
();
void
restore
();
void
backup
(
Array
<
cpio_entry
*>
&
bak
,
const
char
*
orig
,
const
char
*
sha1
);
};
void
magisk_cpio
::
patch
(
bool
keepverity
,
bool
keepforceencrypt
)
{
fprintf
(
stderr
,
"Patch with flag KEEPVERITY=[%s] KEEPFORCEENCRYPT=[%s]
\n
"
,
fprintf
(
stderr
,
"Patch with flag KEEPVERITY=[%s] KEEPFORCEENCRYPT=[%s]
\n
"
,
keepverity
?
"true"
:
"false"
,
keepforceencrypt
?
"true"
:
"false"
);
keepverity
?
"true"
:
"false"
,
keepforceencrypt
?
"true"
:
"false"
);
cpio_entry
*
e
;
for
(
auto
&
e
:
arr
)
{
vec_for_each
(
v
,
e
)
{
if
(
!
e
)
if
(
!
e
)
continue
;
continue
;
if
(
!
keepverity
)
{
if
(
!
keepverity
)
{
if
(
strncmp
(
e
->
filename
,
".backup"
,
7
)
&&
strstr
(
e
->
filename
,
"fstab"
)
&&
S_ISREG
(
e
->
mode
))
{
if
(
strncmp
(
e
->
filename
,
".backup"
,
7
)
&&
strstr
(
e
->
filename
,
"fstab"
)
&&
S_ISREG
(
e
->
mode
))
{
patch_verity
(
&
e
->
data
,
&
e
->
filesize
,
1
);
patch_verity
(
&
e
->
data
,
&
e
->
filesize
,
1
);
}
else
if
(
strcmp
(
e
->
filename
,
"verity_key"
)
==
0
)
{
}
else
if
(
strcmp
(
e
->
filename
,
"verity_key"
)
==
0
)
{
fprintf
(
stderr
,
"Remove [verity_key]
\n
"
);
fprintf
(
stderr
,
"Remove [verity_key]
\n
"
);
cpio_free
(
e
)
;
delete
e
;
vec_cur
(
v
)
=
NULL
;
e
=
nullptr
;
continue
;
continue
;
}
}
}
}
...
@@ -34,33 +41,35 @@ static void cpio_patch(struct vector *v, int keepverity, int keepforceencrypt) {
...
@@ -34,33 +41,35 @@ static void cpio_patch(struct vector *v, int keepverity, int keepforceencrypt) {
}
}
}
}
#define STOCK_BOOT 0x0
#define STOCK_BOOT 0x0
#define MAGISK_PATCH 0x1
#define MAGISK_PATCH 0x1
#define UNSUPPORT_PATCH 0x2
#define UNSUPPORT_PATCH 0x2
int
magisk_cpio
::
test
()
{
static
int
cpio_test
(
struct
vector
*
v
)
{
static
const
char
*
UNSUPPORT_LIST
[]
=
{
"sbin/launch_daemonsu.sh"
,
"sbin/su"
,
"init.xposed.rc"
,
const
char
*
UNSUPPORT_LIST
[]
=
{
"sbin/launch_daemonsu.sh"
,
"sbin/su"
,
"init.xposed.rc"
,
"boot/sbin/launch_daemonsu.sh"
,
NULL
};
"boot/sbin/launch_daemonsu.sh"
,
nullptr
};
const
char
*
MAGISK_LIST
[]
=
{
".backup/.magisk"
,
"init.magisk.rc"
,
"overlay/init.magisk.rc"
,
NULL
};
static
const
char
*
MAGISK_LIST
[]
=
{
".backup/.magisk"
,
"init.magisk.rc"
,
"overlay/init.magisk.rc"
,
nullptr
};
for
(
int
i
=
0
;
UNSUPPORT_LIST
[
i
];
++
i
)
for
(
int
i
=
0
;
UNSUPPORT_LIST
[
i
];
++
i
)
if
(
cpio_find
(
v
,
UNSUPPORT_LIST
[
i
])
>=
0
)
if
(
find
(
UNSUPPORT_LIST
[
i
])
>=
0
)
return
UNSUPPORT_PATCH
;
return
UNSUPPORT_PATCH
;
for
(
int
i
=
0
;
MAGISK_LIST
[
i
];
++
i
)
for
(
int
i
=
0
;
MAGISK_LIST
[
i
];
++
i
)
if
(
cpio_find
(
v
,
MAGISK_LIST
[
i
])
>=
0
)
if
(
find
(
MAGISK_LIST
[
i
])
>=
0
)
return
MAGISK_PATCH
;
return
MAGISK_PATCH
;
return
STOCK_BOOT
;
return
STOCK_BOOT
;
}
}
static
char
*
cpio_sha1
(
struct
vector
*
v
)
{
char
*
magisk_cpio
::
sha1
()
{
cpio_entry
*
e
;
char
sha1
[
41
];
char
sha1
[
41
];
vec_for_each
(
v
,
e
)
{
for
(
auto
&
e
:
arr
)
{
if
(
!
e
)
continue
;
if
(
!
e
)
continue
;
if
(
strcmp
(
e
->
filename
,
"init.magisk.rc"
)
==
0
if
(
strcmp
(
e
->
filename
,
"init.magisk.rc"
)
==
0
||
strcmp
(
e
->
filename
,
"overlay/init.magisk.rc"
)
==
0
)
{
||
strcmp
(
e
->
filename
,
"overlay/init.magisk.rc"
)
==
0
)
{
for
(
void
*
pos
=
e
->
data
;
pos
<
e
->
data
+
e
->
filesize
;
pos
=
strchr
(
pos
+
1
,
'\n'
)
+
1
)
{
for
(
char
*
pos
=
(
char
*
)
e
->
data
;
pos
<
(
char
*
)
e
->
data
+
e
->
filesize
;
pos
=
strchr
(
pos
+
1
,
'\n'
)
+
1
)
{
if
(
memcmp
(
pos
,
"# STOCKSHA1="
,
12
)
==
0
)
{
if
(
memcmp
(
pos
,
"# STOCKSHA1="
,
12
)
==
0
)
{
pos
+=
12
;
pos
+=
12
;
memcpy
(
sha1
,
pos
,
40
);
memcpy
(
sha1
,
pos
,
40
);
...
@@ -69,80 +78,104 @@ static char *cpio_sha1(struct vector *v) {
...
@@ -69,80 +78,104 @@ static char *cpio_sha1(struct vector *v) {
}
}
}
}
}
else
if
(
strcmp
(
e
->
filename
,
".backup/.sha1"
)
==
0
)
{
}
else
if
(
strcmp
(
e
->
filename
,
".backup/.sha1"
)
==
0
)
{
return
e
->
data
;
return
(
char
*
)
e
->
data
;
}
}
return
nullptr
;
}
void
magisk_cpio
::
restore
()
{
for
(
auto
&
e
:
arr
)
{
if
(
!
e
)
continue
;
if
(
strncmp
(
e
->
filename
,
".backup"
,
7
)
==
0
)
{
if
(
e
->
filename
[
7
]
==
'\0'
)
continue
;
if
(
e
->
filename
[
8
]
==
'.'
)
{
if
(
strcmp
(
e
->
filename
+
8
,
".rmlist"
)
==
0
)
{
for
(
int
pos
=
0
;
pos
<
e
->
filesize
;
pos
+=
strlen
((
char
*
)
e
->
data
+
pos
)
+
1
)
rm
(
false
,
(
char
*
)
e
->
data
+
pos
);
}
}
else
{
mv
(
e
->
filename
,
e
->
filename
+
8
);
}
}
}
}
}
return
NULL
;
// Some known stuff we can remove
rm
(
true
,
".backup"
);
rm
(
true
,
"overlay"
);
rm
(
false
,
"sbin/magic_mask.sh"
);
rm
(
false
,
"init.magisk.rc"
);
rm
(
true
,
"magisk"
);
}
}
static
void
cpio_backup
(
struct
vector
*
v
,
struct
vector
*
bak
,
const
char
*
orig
,
const
char
*
sha1
)
{
void
magisk_cpio
::
backup
(
Array
<
cpio_entry
*>
&
bak
,
const
char
*
orig
,
const
char
*
sha1
)
{
struct
vector
o_body
,
*
o
=
&
o_body
;
cpio_entry
*
m
,
*
n
,
*
rem
,
*
cksm
;
cpio_entry
*
m
,
*
n
,
*
rem
,
*
cksm
;
char
buf
[
PATH_MAX
];
char
buf
[
PATH_MAX
];
int
res
,
backup
;
int
res
;
bool
backup
;
m
=
xcalloc
(
sizeof
(
*
m
),
1
);
m
=
new
cpio_entry
(
);
m
->
filename
=
strdup
(
".backup"
);
m
->
filename
=
strdup
(
".backup"
);
m
->
mode
=
S_IFDIR
;
m
->
mode
=
S_IFDIR
;
vec_push_back
(
bak
,
m
);
bak
.
push_back
(
m
);
rem
=
xcalloc
(
sizeof
(
*
rem
),
1
);
rem
=
new
cpio_entry
(
);
rem
->
filename
=
strdup
(
".backup/.rmlist"
);
rem
->
filename
=
strdup
(
".backup/.rmlist"
);
rem
->
mode
=
S_IFREG
;
rem
->
mode
=
S_IFREG
;
if
(
sha1
)
{
if
(
sha1
)
{
fprintf
(
stderr
,
"Save SHA1: [%s] -> [.backup/.sha1]
\n
"
,
sha1
);
fprintf
(
stderr
,
"Save SHA1: [%s] -> [.backup/.sha1]
\n
"
,
sha1
);
cksm
=
xcalloc
(
sizeof
(
*
cksm
),
1
);
cksm
=
new
cpio_entry
(
);
vec_push_back
(
bak
,
cksm
);
bak
.
push_back
(
cksm
);
cksm
->
filename
=
strdup
(
".backup/.sha1"
);
cksm
->
filename
=
strdup
(
".backup/.sha1"
);
cksm
->
mode
=
S_IFREG
;
cksm
->
mode
=
S_IFREG
;
cksm
->
data
=
strdup
(
sha1
);
cksm
->
data
=
strdup
(
sha1
);
cksm
->
filesize
=
strlen
(
sha1
)
+
1
;
cksm
->
filesize
=
strlen
(
sha1
)
+
1
;
}
}
vec_init
(
o
);
magisk_cpio
o
=
magisk_cpio
(
orig
);
parse_cpio
(
o
,
orig
);
// Remove possible backups in original ramdisk
// Remove possible backups in original ramdisk
cpio_rm
(
o
,
1
,
".backup"
);
o
.
rm
(
true
,
".backup"
);
cpio_rm
(
v
,
1
,
".backup"
);
rm
(
true
,
".backup"
);
// Sort both
vector
s before comparing
// Sort both
CPIO
s before comparing
vec_sort
(
o
,
cpio_cmp
);
o
.
sort
(
);
vec_sort
(
v
,
cpio_cmp
);
sort
(
);
// Start comparing
// Start comparing
size_t
i
=
0
,
j
=
0
;
size_t
i
=
0
,
j
=
0
;
while
(
i
!=
vec_size
(
o
)
||
j
!=
vec_size
(
v
))
{
while
(
i
!=
o
.
arr
.
size
()
||
j
!=
arr
.
size
(
))
{
backup
=
0
;
backup
=
false
;
if
(
i
!=
vec_size
(
o
)
&&
j
!=
vec_size
(
v
))
{
if
(
i
!=
o
.
arr
.
size
()
&&
j
!=
arr
.
size
(
))
{
m
=
vec_entry
(
o
)
[
i
];
m
=
o
.
arr
[
i
];
n
=
vec_entry
(
v
)
[
j
];
n
=
arr
[
j
];
res
=
strcmp
(
m
->
filename
,
n
->
filename
);
res
=
strcmp
(
m
->
filename
,
n
->
filename
);
}
else
if
(
i
==
vec_size
(
o
))
{
}
else
if
(
i
==
o
.
arr
.
size
(
))
{
n
=
vec_entry
(
v
)
[
j
];
n
=
arr
[
j
];
res
=
1
;
res
=
1
;
}
else
if
(
j
==
vec_size
(
v
))
{
}
else
if
(
j
==
arr
.
size
(
))
{
m
=
vec_entry
(
o
)
[
i
];
m
=
o
.
arr
[
i
];
res
=
-
1
;
res
=
-
1
;
}
}
if
(
res
<
0
)
{
if
(
res
<
0
)
{
// Something is missing in new ramdisk, backup!
// Something is missing in new ramdisk, backup!
++
i
;
++
i
;
backup
=
1
;
backup
=
true
;
fprintf
(
stderr
,
"Backup missing entry: "
);
fprintf
(
stderr
,
"Backup missing entry: "
);
}
else
if
(
res
==
0
)
{
}
else
if
(
res
==
0
)
{
++
i
;
++
j
;
++
i
;
++
j
;
if
(
m
->
filesize
==
n
->
filesize
&&
memcmp
(
m
->
data
,
n
->
data
,
m
->
filesize
)
==
0
)
if
(
m
->
filesize
==
n
->
filesize
&&
memcmp
(
m
->
data
,
n
->
data
,
m
->
filesize
)
==
0
)
continue
;
continue
;
// Not the same!
// Not the same!
backup
=
1
;
backup
=
true
;
fprintf
(
stderr
,
"Backup mismatch entry: "
);
fprintf
(
stderr
,
"Backup mismatch entry: "
);
}
else
{
}
else
{
// Something new in ramdisk, record in rem
// Something new in ramdisk, record in rem
++
j
;
++
j
;
rem
->
data
=
xrealloc
(
rem
->
data
,
rem
->
filesize
+
strlen
(
n
->
filename
)
+
1
);
rem
->
data
=
xrealloc
(
rem
->
data
,
rem
->
filesize
+
strlen
(
n
->
filename
)
+
1
);
memcpy
(
rem
->
data
+
rem
->
filesize
,
n
->
filename
,
strlen
(
n
->
filename
)
+
1
);
memcpy
(
(
char
*
)
rem
->
data
+
rem
->
filesize
,
n
->
filename
,
strlen
(
n
->
filename
)
+
1
);
rem
->
filesize
+=
strlen
(
n
->
filename
)
+
1
;
rem
->
filesize
+=
strlen
(
n
->
filename
)
+
1
;
fprintf
(
stderr
,
"Record new entry: [%s] -> [.backup/.rmlist]
\n
"
,
n
->
filename
);
fprintf
(
stderr
,
"Record new entry: [%s] -> [.backup/.rmlist]
\n
"
,
n
->
filename
);
}
}
...
@@ -151,59 +184,25 @@ static void cpio_backup(struct vector *v, struct vector *bak, const char *orig,
...
@@ -151,59 +184,25 @@ static void cpio_backup(struct vector *v, struct vector *bak, const char *orig,
fprintf
(
stderr
,
"[%s] -> [%s]
\n
"
,
m
->
filename
,
buf
);
fprintf
(
stderr
,
"[%s] -> [%s]
\n
"
,
m
->
filename
,
buf
);
free
(
m
->
filename
);
free
(
m
->
filename
);
m
->
filename
=
strdup
(
buf
);
m
->
filename
=
strdup
(
buf
);
vec_push_back
(
bak
,
m
);
bak
.
push_back
(
m
);
// NULL the original entry, so it won't be freed
// NULL the original entry, so it won't be freed
vec_entry
(
o
)[
i
-
1
]
=
NULL
;
o
.
arr
[
i
-
1
]
=
nullptr
;
}
}
}
}
if
(
rem
->
filesize
)
if
(
rem
->
filesize
)
vec_push_back
(
bak
,
rem
);
bak
.
push_back
(
rem
);
else
else
cpio_free
(
rem
);
delete
rem
;
// Cleanup
cpio_vec_destroy
(
o
);
}
}
static
void
cpio_restore
(
struct
vector
*
v
)
{
cpio_entry
*
e
;
vec_for_each
(
v
,
e
)
{
if
(
!
e
)
continue
;
if
(
strncmp
(
e
->
filename
,
".backup"
,
7
)
==
0
)
{
if
(
e
->
filename
[
7
]
==
'\0'
)
continue
;
if
(
e
->
filename
[
8
]
==
'.'
)
{
if
(
strcmp
(
e
->
filename
,
".backup/.rmlist"
)
==
0
)
{
for
(
int
pos
=
0
;
pos
<
e
->
filesize
;
pos
+=
strlen
(
e
->
data
+
pos
)
+
1
)
cpio_rm
(
v
,
0
,
e
->
data
+
pos
);
}
continue
;
}
else
{
fprintf
(
stderr
,
"Restore [%s] -> [%s]
\n
"
,
e
->
filename
,
e
->
filename
+
8
);
vec_cur
(
v
)
=
NULL
;
char
*
new_name
=
strdup
(
e
->
filename
+
8
);
free
(
e
->
filename
);
e
->
filename
=
new_name
;
cpio_vec_insert
(
v
,
e
);
}
}
}
// Some known stuff we can remove
cpio_rm
(
v
,
1
,
".backup"
);
cpio_rm
(
v
,
1
,
"overlay"
);
cpio_rm
(
v
,
0
,
"sbin/magic_mask.sh"
);
cpio_rm
(
v
,
0
,
"init.magisk.rc"
);
cpio_rm
(
v
,
0
,
"magisk"
);
}
int
cpio_commands
(
int
argc
,
char
*
argv
[])
{
int
cpio_commands
(
int
argc
,
char
*
argv
[])
{
char
*
incpio
=
argv
[
0
];
char
*
incpio
=
argv
[
0
];
++
argv
;
++
argv
;
--
argc
;
--
argc
;
struct
vector
v
;
magisk_cpio
cpio
=
magisk_cpio
(
incpio
);
vec_init
(
&
v
);
parse_cpio
(
&
v
,
incpio
);
int
cmdc
;
int
cmdc
;
char
*
cmdv
[
6
];
char
*
cmdv
[
6
];
...
@@ -214,61 +213,54 @@ int cpio_commands(int argc, char *argv[]) {
...
@@ -214,61 +213,54 @@ int cpio_commands(int argc, char *argv[]) {
cmdv
[
cmdc
++
]
=
tok
;
cmdv
[
cmdc
++
]
=
tok
;
if
(
strcmp
(
cmdv
[
0
],
"test"
)
==
0
)
{
if
(
strcmp
(
cmdv
[
0
],
"test"
)
==
0
)
{
exit
(
cpio
_test
(
&
v
));
exit
(
cpio
.
test
(
));
}
else
if
(
strcmp
(
cmdv
[
0
],
"restore"
)
==
0
)
{
}
else
if
(
strcmp
(
cmdv
[
0
],
"restore"
)
==
0
)
{
cpio
_restore
(
&
v
);
cpio
.
restore
(
);
}
else
if
(
strcmp
(
cmdv
[
0
],
"sha1"
)
==
0
)
{
}
else
if
(
strcmp
(
cmdv
[
0
],
"sha1"
)
==
0
)
{
char
*
sha1
=
cpio
_sha1
(
&
v
);
char
*
sha1
=
cpio
.
sha1
(
);
if
(
sha1
)
if
(
sha1
)
printf
(
"%s
\n
"
,
sha1
);
printf
(
"%s
\n
"
,
sha1
);
free
(
sha1
);
return
0
;
return
0
;
}
else
if
(
cmdc
>=
2
&&
strcmp
(
cmdv
[
0
],
"backup"
)
==
0
)
{
}
else
if
(
cmdc
>=
2
&&
strcmp
(
cmdv
[
0
],
"backup"
)
==
0
)
{
struct
vector
back
;
auto
bak
=
Array
<
cpio_entry
*>
();
vec_init
(
&
back
);
cpio
.
backup
(
bak
,
cmdv
[
1
],
cmdc
>
2
?
cmdv
[
2
]
:
nullptr
);
cpio_backup
(
&
v
,
&
back
,
cmdv
[
1
],
cmdc
>
2
?
cmdv
[
2
]
:
NULL
);
cpio
.
insert
(
bak
);
cpio_entry
*
e
;
vec_for_each
(
&
back
,
e
)
if
(
e
)
vec_push_back
(
&
v
,
e
);
vec_destroy
(
&
back
);
}
else
if
(
cmdc
>=
4
&&
strcmp
(
cmdv
[
0
],
"magisk"
)
==
0
)
{
}
else
if
(
cmdc
>=
4
&&
strcmp
(
cmdv
[
0
],
"magisk"
)
==
0
)
{
cpio
_patch
(
&
v
,
strcmp
(
cmdv
[
2
],
"true"
)
==
0
,
strcmp
(
cmdv
[
3
],
"true"
)
==
0
);
cpio
.
patch
(
strcmp
(
cmdv
[
2
],
"true"
)
==
0
,
strcmp
(
cmdv
[
3
],
"true"
)
==
0
);
struct
vector
back
;
auto
bak
=
Array
<
cpio_entry
*>
();
vec_init
(
&
back
);
cpio
.
backup
(
bak
,
cmdv
[
1
],
cmdc
>
4
?
cmdv
[
4
]
:
nullptr
);
cpio_backup
(
&
v
,
&
back
,
cmdv
[
1
],
cmdc
>
4
?
cmdv
[
4
]
:
NULL
);
cpio_entry
*
e
;
auto
e
=
new
cpio_entry
();
e
=
xcalloc
(
sizeof
(
*
e
),
1
);
e
->
filename
=
strdup
(
".backup/.magisk"
);
e
->
filename
=
strdup
(
".backup/.magisk"
);
e
->
mode
=
S_IFREG
;
e
->
mode
=
S_IFREG
;
e
->
data
=
xmalloc
(
50
);
e
->
data
=
xmalloc
(
50
);
snprintf
(
e
->
data
,
50
,
"KEEPVERITY=%s
\n
KEEPFORCEENCRYPT=%s
\n
"
,
cmdv
[
2
],
cmdv
[
3
]);
snprintf
((
char
*
)
e
->
data
,
50
,
"KEEPVERITY=%s
\n
KEEPFORCEENCRYPT=%s
\n
"
,
cmdv
[
2
],
cmdv
[
3
]);
e
->
filesize
=
strlen
(
e
->
data
)
+
1
;
e
->
filesize
=
strlen
((
char
*
)
e
->
data
)
+
1
;
vec_push_back
(
&
back
,
e
);
vec_for_each
(
&
back
,
e
)
cpio
.
insert
(
bak
);
if
(
e
)
vec_push_back
(
&
v
,
e
);
cpio
.
insert
(
e
);
vec_destroy
(
&
back
);
}
else
if
(
cmdc
>=
2
&&
strcmp
(
cmdv
[
0
],
"rm"
)
==
0
)
{
}
else
if
(
cmdc
>=
2
&&
strcmp
(
cmdv
[
0
],
"rm"
)
==
0
)
{
int
recur
=
cmdc
>
2
&&
strcmp
(
cmdv
[
1
],
"-r"
)
==
0
;
int
recur
=
cmdc
>
2
&&
strcmp
(
cmdv
[
1
],
"-r"
)
==
0
;
cpio
_rm
(
&
v
,
recur
,
cmdv
[
1
+
recur
]);
cpio
.
rm
(
recur
,
cmdv
[
1
+
recur
]);
}
else
if
(
cmdc
==
3
&&
strcmp
(
cmdv
[
0
],
"mv"
)
==
0
)
{
}
else
if
(
cmdc
==
3
&&
strcmp
(
cmdv
[
0
],
"mv"
)
==
0
)
{
cpio
_mv
(
&
v
,
cmdv
[
1
],
cmdv
[
2
]);
cpio
.
mv
(
cmdv
[
1
],
cmdv
[
2
]);
}
else
if
(
cmdc
==
3
&&
strcmp
(
cmdv
[
0
],
"patch"
)
==
0
)
{
}
else
if
(
cmdc
==
3
&&
strcmp
(
cmdv
[
0
],
"patch"
)
==
0
)
{
cpio
_patch
(
&
v
,
strcmp
(
cmdv
[
1
],
"true"
)
==
0
,
strcmp
(
cmdv
[
2
],
"true"
)
==
0
);
cpio
.
patch
(
strcmp
(
cmdv
[
1
],
"true"
)
==
0
,
strcmp
(
cmdv
[
2
],
"true"
)
==
0
);
}
else
if
(
strcmp
(
cmdv
[
0
],
"extract"
)
==
0
)
{
}
else
if
(
strcmp
(
cmdv
[
0
],
"extract"
)
==
0
)
{
if
(
cmdc
==
3
)
{
if
(
cmdc
==
3
)
{
return
cpio
_extract
(
&
v
,
cmdv
[
1
],
cmdv
[
2
]);
return
cpio
.
extract
(
cmdv
[
1
],
cmdv
[
2
]);
}
else
{
}
else
{
cpio
_extract_all
(
&
v
);
cpio
.
extract
(
);
return
0
;
return
0
;
}
}
}
else
if
(
cmdc
==
3
&&
strcmp
(
cmdv
[
0
],
"mkdir"
)
==
0
)
{
}
else
if
(
cmdc
==
3
&&
strcmp
(
cmdv
[
0
],
"mkdir"
)
==
0
)
{
cpio
_mkdir
(
&
v
,
strtoul
(
cmdv
[
1
],
NULL
,
8
),
cmdv
[
2
]);
cpio
.
makedir
(
strtoul
(
cmdv
[
1
],
NULL
,
8
),
cmdv
[
2
]);
}
else
if
(
cmdc
==
3
&&
strcmp
(
cmdv
[
0
],
"ln"
)
==
0
)
{
}
else
if
(
cmdc
==
3
&&
strcmp
(
cmdv
[
0
],
"ln"
)
==
0
)
{
cpio
_ln
(
&
v
,
cmdv
[
1
],
cmdv
[
2
]);
cpio
.
ln
(
cmdv
[
1
],
cmdv
[
2
]);
}
else
if
(
cmdc
==
4
&&
strcmp
(
cmdv
[
0
],
"add"
)
==
0
)
{
}
else
if
(
cmdc
==
4
&&
strcmp
(
cmdv
[
0
],
"add"
)
==
0
)
{
cpio
_add
(
&
v
,
strtoul
(
cmdv
[
1
],
NULL
,
8
),
cmdv
[
2
],
cmdv
[
3
]);
cpio
.
add
(
strtoul
(
cmdv
[
1
],
NULL
,
8
),
cmdv
[
2
],
cmdv
[
3
]);
}
else
{
}
else
{
return
1
;
return
1
;
}
}
...
@@ -277,7 +269,6 @@ int cpio_commands(int argc, char *argv[]) {
...
@@ -277,7 +269,6 @@ int cpio_commands(int argc, char *argv[]) {
++
argv
;
++
argv
;
}
}
dump_cpio
(
&
v
,
incpio
);
cpio
.
dump
(
incpio
);
cpio_vec_destroy
(
&
v
);
return
0
;
return
0
;
}
}
\ No newline at end of file
native/jni/utils/include/array.h
0 → 100644
View file @
fc8a3c5f
#pragma once
#include <stdlib.h>
template
<
class
T
>
class
Array
{
public
:
Array
()
:
_data
(
0
),
_size
(
0
),
_capacity
(
0
)
{}
~
Array
()
{
delete
[]
_data
;
}
class
iterator
{
friend
class
Array
;
public
:
iterator
(
T
*
n
=
0
)
:
_node
(
n
)
{}
iterator
(
const
iterator
&
i
)
:
_node
(
i
.
_node
)
{}
~
iterator
()
{}
// Should NOT delete _node
const
T
&
operator
*
()
const
{
return
(
*
_node
);
}
T
&
operator
*
()
{
return
(
*
_node
);
}
iterator
&
operator
++
()
{
++
_node
;
return
(
*
this
);
}
iterator
operator
++
(
int
)
{
iterator
temp
=
*
this
;
++
_node
;
return
temp
;
}
iterator
&
operator
--
()
{
--
_node
;
return
(
*
this
);
}
iterator
operator
--
(
int
)
{
iterator
temp
=
*
this
;
--
_node
;
return
temp
;
}
iterator
operator
+
(
int
i
)
const
{
iterator
temp
=
*
this
;
temp
+=
i
;
return
temp
;
}
iterator
&
operator
+=
(
int
i
)
{
_node
+=
i
;
return
(
*
this
);
}
iterator
&
operator
=
(
const
iterator
&
i
)
{
_node
=
i
.
_node
;
return
(
*
this
);
}
bool
operator
!=
(
const
iterator
&
i
)
const
{
return
_node
!=
i
.
_node
;
}
bool
operator
==
(
const
iterator
&
i
)
const
{
return
!
(
*
this
!=
i
);
}
private
:
T
*
_node
;
};
iterator
begin
()
const
{
return
iterator
(
_data
);
}
iterator
end
()
const
{
return
iterator
(
_data
+
_size
);
}
bool
empty
()
const
{
return
!
_size
;
}
size_t
size
()
const
{
return
_size
;
}
T
&
operator
[]
(
size_t
i
)
{
return
_data
[
i
];
}
const
T
&
operator
[]
(
size_t
i
)
const
{
return
_data
[
i
];
}
const
T
&
back
()
const
{
return
_data
[
_size
-
1
];
}
void
push_back
(
const
T
&
x
)
{
if
(
_size
==
_capacity
)
expand
();
_data
[
_size
]
=
x
;
++
_size
;
}
void
pop_front
()
{
erase
(
begin
());
}
void
pop_back
()
{
if
(
_size
)
--
_size
;
}
bool
erase
(
iterator
pos
)
{
T
*
d
=
pos
.
_node
;
if
(
_size
==
0
||
d
<
_data
||
d
>=
_data
+
_size
)
return
false
;
for
(;
d
<
_data
+
_size
-
1
;
++
d
)
*
d
=
*
(
d
+
1
);
--
_size
;
return
true
;
}
bool
erase
(
const
T
&
x
)
{
for
(
T
*
i
=
_data
;
i
<
_data
+
_size
;
++
i
)
{
if
(
*
i
==
x
)
{
erase
(
iterator
(
i
));
return
true
;
}
}
return
false
;
}
void
clear
()
{
_size
=
0
;
}
void
sort
()
const
{
qsort
(
_data
,
_size
,
sizeof
(
T
),
compare
);
}
// void reserve(size_t n) { ... }
// void resize(size_t n) { ... }
private
:
T
*
_data
;
size_t
_size
;
// number of valid elements
size_t
_capacity
;
// max number of elements
static
int
(
*
_cmp
)(
T
&
,
T
&
);
static
int
compare
(
const
void
*
a
,
const
void
*
b
)
{
return
_cmp
?
_cmp
(
*
((
T
*
)
a
),
*
((
T
*
)
b
))
:
0
;
}
void
expand
()
{
if
(
_capacity
==
0
)
_capacity
=
1
;
else
_capacity
*=
2
;
T
*
temp
=
_data
;
_data
=
new
T
[
_capacity
];
for
(
int
i
=
0
;
i
<
_size
;
++
i
)
_data
[
i
]
=
temp
[
i
];
delete
[]
temp
;
}
};
template
<
class
T
>
int
(
*
Array
<
T
>::
_cmp
)(
T
&
,
T
&
)
=
nullptr
;
native/jni/utils/include/logging.h
View file @
fc8a3c5f
...
@@ -7,6 +7,10 @@
...
@@ -7,6 +7,10 @@
#include <stdarg.h>
#include <stdarg.h>
#include <string.h>
#include <string.h>
#ifdef __cplusplus
extern
"C"
{
#endif
#define str(a) #a
#define str(a) #a
#define xstr(a) str(a)
#define xstr(a) str(a)
...
@@ -42,3 +46,6 @@ void cmdline_logging();
...
@@ -42,3 +46,6 @@ void cmdline_logging();
int
log_handler
(
log_type
t
,
const
char
*
fmt
,
...);
int
log_handler
(
log_type
t
,
const
char
*
fmt
,
...);
#ifdef __cplusplus
}
#endif
native/jni/utils/include/utils.h
View file @
fc8a3c5f
...
@@ -11,6 +11,10 @@
...
@@ -11,6 +11,10 @@
#include <sys/socket.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/stat.h>
#ifdef __cplusplus
extern
"C"
{
#endif
#include "vector.h"
#include "vector.h"
#define UID_SHELL (get_shell_uid())
#define UID_SHELL (get_shell_uid())
...
@@ -140,4 +144,8 @@ void full_read_at(int dirfd, const char *filename, void **buf, size_t *size);
...
@@ -140,4 +144,8 @@ void full_read_at(int dirfd, const char *filename, void **buf, size_t *size);
void
stream_full_read
(
int
fd
,
void
**
buf
,
size_t
*
size
);
void
stream_full_read
(
int
fd
,
void
**
buf
,
size_t
*
size
);
void
write_zero
(
int
fd
,
size_t
size
);
void
write_zero
(
int
fd
,
size_t
size
);
#ifdef __cplusplus
}
#endif
#endif
#endif
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