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
c7ed0ef5
Commit
c7ed0ef5
authored
Apr 26, 2020
by
topjohnwu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix SAR support for overlay.d
parent
2aede977
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
48 additions
and
19 deletions
+48
-19
magiskrc.inc
native/jni/init/magiskrc.inc
+1
-1
rootdir.cpp
native/jni/init/rootdir.cpp
+17
-18
files.cpp
native/jni/utils/files.cpp
+15
-0
files.hpp
native/jni/utils/files.hpp
+2
-0
misc.cpp
native/jni/utils/misc.cpp
+12
-0
misc.hpp
native/jni/utils/misc.hpp
+1
-0
No files found.
native/jni/init/magiskrc.inc
View file @
c7ed0ef5
#include <magisk.hpp>
#include <selinux.hpp>
constexpr
char
magiskrc
[]
=
constexpr
char
MAGISK_RC
[]
=
"
\n
"
"on post-fs-data
\n
"
...
...
native/jni/init/rootdir.cpp
View file @
c7ed0ef5
...
...
@@ -20,7 +20,7 @@
using
namespace
std
;
static
vector
<
raw_data
>
rc_list
;
static
vector
<
string
>
rc_list
;
static
void
patch_init_rc
(
const
char
*
src
,
const
char
*
dest
,
const
char
*
tmp_dir
)
{
FILE
*
rc
=
xfopen
(
dest
,
"we"
);
...
...
@@ -44,8 +44,11 @@ static void patch_init_rc(const char *src, const char *dest, const char *tmp_dir
fprintf
(
rc
,
"
\n
"
);
// Inject custom rc scripts
for
(
auto
&
d
:
rc_list
)
fprintf
(
rc
,
"
\n
%s
\n
"
,
d
.
buf
);
for
(
auto
&
script
:
rc_list
)
{
// Replace template arguments of rc scripts with dynamic paths
replace_all
(
script
,
"${MAGISKTMP}"
,
tmp_dir
);
fprintf
(
rc
,
"
\n
%s
\n
"
,
script
.
data
());
}
rc_list
.
clear
();
// Inject Magisk rc scripts
...
...
@@ -54,7 +57,7 @@ static void patch_init_rc(const char *src, const char *dest, const char *tmp_dir
gen_rand_str
(
ls_svc
,
sizeof
(
ls_svc
));
gen_rand_str
(
bc_svc
,
sizeof
(
bc_svc
));
LOGD
(
"Inject magisk services: [%s] [%s] [%s]
\n
"
,
pfd_svc
,
ls_svc
,
bc_svc
);
fprintf
(
rc
,
magiskrc
,
tmp_dir
,
pfd_svc
,
ls_svc
,
bc_svc
);
fprintf
(
rc
,
MAGISK_RC
,
tmp_dir
,
pfd_svc
,
ls_svc
,
bc_svc
);
fclose
(
rc
);
clone_attr
(
src
,
dest
);
...
...
@@ -67,14 +70,12 @@ static void load_overlay_rc(const char *overlay) {
int
dfd
=
dirfd
(
dir
.
get
());
// Do not allow overwrite init.rc
unlinkat
(
dfd
,
"init.rc"
,
0
);
for
(
dirent
*
entry
;
(
entry
=
readdir
(
dir
.
get
()));)
{
for
(
dirent
*
entry
;
(
entry
=
x
readdir
(
dir
.
get
()));)
{
if
(
strend
(
entry
->
d_name
,
".rc"
)
==
0
)
{
LOGD
(
"Found rc script [%s]
\n
"
,
entry
->
d_name
);
int
rc
=
xopenat
(
dfd
,
entry
->
d_name
,
O_RDONLY
|
O_CLOEXEC
);
raw_data
data
;
fd_full_read
(
rc
,
data
.
buf
,
data
.
sz
);
rc_list
.
push_back
(
fd_full_read
(
rc
));
close
(
rc
);
rc_list
.
push_back
(
std
::
move
(
data
));
unlinkat
(
dfd
,
entry
->
d_name
,
0
);
}
}
...
...
@@ -261,8 +262,7 @@ void SARBase::patch_rootdir() {
bool
redirect
=
false
;
int
src
=
xopen
(
"/init"
,
O_RDONLY
|
O_CLOEXEC
);
fd_full_read
(
src
,
init
.
buf
,
init
.
sz
);
uint8_t
*
eof
=
init
.
buf
+
init
.
sz
;
for
(
uint8_t
*
p
=
init
.
buf
;
p
<
eof
;)
{
for
(
uint8_t
*
p
=
init
.
buf
,
*
eof
=
init
.
buf
+
init
.
sz
;
p
<
eof
;)
{
if
(
memcmp
(
p
,
SPLIT_PLAT_CIL
,
sizeof
(
SPLIT_PLAT_CIL
))
==
0
)
{
LOGD
(
"Remove from init: "
SPLIT_PLAT_CIL
"
\n
"
);
memset
(
p
,
'x'
,
sizeof
(
SPLIT_PLAT_CIL
)
-
1
);
...
...
@@ -287,8 +287,7 @@ void SARBase::patch_rootdir() {
// init is dynamically linked, need to patch libselinux
raw_data
lib
;
full_read
(
LIBSELINUX
,
lib
.
buf
,
lib
.
sz
);
eof
=
lib
.
buf
+
lib
.
sz
;
for
(
uint8_t
*
p
=
lib
.
buf
;
p
<
eof
;
++
p
)
{
for
(
uint8_t
*
p
=
lib
.
buf
,
*
eof
=
lib
.
buf
+
lib
.
sz
;
p
<
eof
;
++
p
)
{
if
(
memcmp
(
p
,
MONOPOLICY
,
sizeof
(
MONOPOLICY
))
==
0
)
{
LOGD
(
"Patch libselinux.so ["
MONOPOLICY
"] -> [%s]
\n
"
,
sepol
);
strcpy
(
reinterpret_cast
<
char
*>
(
p
),
sepol
);
...
...
@@ -305,7 +304,7 @@ void SARBase::patch_rootdir() {
// sepolicy
patch_sepolicy
(
sepol
);
//
Handle overlay
//
Restore backup files
struct
sockaddr_un
sun
;
int
sockfd
=
xsocket
(
AF_LOCAL
,
SOCK_STREAM
|
SOCK_CLOEXEC
,
0
);
if
(
connect
(
sockfd
,
(
struct
sockaddr
*
)
&
sun
,
setup_sockaddr
(
&
sun
,
INIT_SOCKET
))
==
0
)
{
...
...
@@ -321,12 +320,12 @@ void SARBase::patch_rootdir() {
overlays
.
clear
();
}
close
(
sockfd
);
// Handle overlay.d
load_overlay_rc
(
ROOTOVL
);
if
(
access
(
ROOTOVL
"/sbin"
,
F_OK
)
==
0
)
{
file_attr
a
;
getattr
(
"/sbin"
,
&
a
);
cp_afc
(
ROOTOVL
"/sbin"
,
"/sbin"
);
rm_rf
(
ROOTOVL
"/sbin"
);
setattr
(
"/sbin"
,
&
a
);
// Move files in overlay.d/sbin into Magisk's tmp_dir
mv_path
(
ROOTOVL
"/sbin"
,
tmp_dir
);
}
// Patch init.rc
...
...
native/jni/utils/files.cpp
View file @
c7ed0ef5
...
...
@@ -301,6 +301,21 @@ void full_read(const char *filename, void **buf, size_t *size) {
close
(
fd
);
}
string
fd_full_read
(
int
fd
)
{
string
str
;
auto
len
=
lseek
(
fd
,
0
,
SEEK_END
);
str
.
resize
(
len
);
lseek
(
fd
,
0
,
SEEK_SET
);
xxread
(
fd
,
str
.
data
(),
len
);
return
str
;
}
string
full_read
(
const
char
*
filename
)
{
int
fd
=
xopen
(
filename
,
O_RDONLY
|
O_CLOEXEC
);
run_finally
f
([
=
]{
close
(
fd
);
});
return
fd
<
0
?
""
:
fd_full_read
(
fd
);
}
void
write_zero
(
int
fd
,
size_t
size
)
{
char
buf
[
4096
]
=
{
0
};
size_t
len
;
...
...
native/jni/utils/files.hpp
View file @
c7ed0ef5
...
...
@@ -58,6 +58,8 @@ void fclone_attr(int src, int dest);
void
clone_attr
(
const
char
*
src
,
const
char
*
dest
);
void
fd_full_read
(
int
fd
,
void
**
buf
,
size_t
*
size
);
void
full_read
(
const
char
*
filename
,
void
**
buf
,
size_t
*
size
);
std
::
string
fd_full_read
(
int
fd
);
std
::
string
full_read
(
const
char
*
filename
);
void
write_zero
(
int
fd
,
size_t
size
);
void
file_readline
(
bool
trim
,
const
char
*
file
,
const
std
::
function
<
bool
(
std
::
string_view
)
>
&
fn
);
static
inline
void
file_readline
(
const
char
*
file
,
...
...
native/jni/utils/misc.cpp
View file @
c7ed0ef5
...
...
@@ -13,10 +13,13 @@
#include <unistd.h>
#include <syscall.h>
#include <random>
#include <string>
#include <logging.hpp>
#include <utils.hpp>
using
namespace
std
;
int
fork_dont_care
()
{
int
pid
=
xfork
();
if
(
pid
)
{
...
...
@@ -214,3 +217,12 @@ int switch_mnt_ns(int pid) {
close
(
fd
);
return
ret
;
}
string
&
replace_all
(
string
&
str
,
string_view
from
,
string_view
to
)
{
size_t
pos
=
0
;
while
((
pos
=
str
.
find
(
from
,
pos
))
!=
string
::
npos
)
{
str
.
replace
(
pos
,
from
.
length
(),
to
);
pos
+=
to
.
length
();
}
return
str
;
}
native/jni/utils/misc.hpp
View file @
c7ed0ef5
...
...
@@ -106,3 +106,4 @@ void set_nice_name(const char *name);
uint32_t
binary_gcd
(
uint32_t
u
,
uint32_t
v
);
int
switch_mnt_ns
(
int
pid
);
int
gen_rand_str
(
char
*
buf
,
int
len
,
bool
varlen
=
true
);
std
::
string
&
replace_all
(
std
::
string
&
str
,
std
::
string_view
from
,
std
::
string_view
to
);
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