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
e89c50d9
Commit
e89c50d9
authored
Aug 29, 2019
by
topjohnwu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Support /system/product wihtout /product
Fix #1676
parent
c859ddfb
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
32 additions
and
29 deletions
+32
-29
bootstages.cpp
native/jni/core/bootstages.cpp
+32
-29
No files found.
native/jni/core/bootstages.cpp
View file @
e89c50d9
...
@@ -55,15 +55,18 @@ extern void auto_start_magiskhide();
...
@@ -55,15 +55,18 @@ extern void auto_start_magiskhide();
class
node_entry
{
class
node_entry
{
public
:
public
:
explicit
node_entry
(
const
char
*
name
,
uint8_t
status
=
0
,
uint8_t
type
=
0
)
explicit
node_entry
(
const
char
*
name
,
uint8_t
type
=
DT_DIR
,
uint8_t
status
=
IS_INTER
)
:
name
(
name
),
type
(
type
),
status
(
status
),
parent
(
nullptr
)
{}
:
module
(
nullptr
),
name
(
name
),
type
(
type
),
status
(
status
),
parent
(
nullptr
)
{}
~
node_entry
();
~
node_entry
();
void
create_module_tree
(
const
char
*
module
);
void
create_module_tree
(
const
char
*
module
);
void
magic_mount
();
void
magic_mount
();
node_entry
*
extract
(
const
char
*
name
);
node_entry
*
extract
(
const
char
*
name
);
static
bool
vendor_root
;
static
bool
product_root
;
private
:
private
:
const
char
*
module
;
/* Only used when
status &
IS_MODULE */
const
char
*
module
;
/* Only used when IS_MODULE */
const
string
name
;
const
string
name
;
uint8_t
type
;
uint8_t
type
;
uint8_t
status
;
uint8_t
status
;
...
@@ -71,10 +74,7 @@ private:
...
@@ -71,10 +74,7 @@ private:
vector
<
node_entry
*>
children
;
vector
<
node_entry
*>
children
;
node_entry
(
node_entry
*
parent
,
const
char
*
module
,
const
char
*
name
,
uint8_t
type
)
node_entry
(
node_entry
*
parent
,
const
char
*
module
,
const
char
*
name
,
uint8_t
type
)
:
node_entry
(
name
,
0
,
type
)
{
:
module
(
module
),
name
(
name
),
type
(
type
),
status
(
0
),
parent
(
parent
)
{}
this
->
parent
=
parent
;
this
->
module
=
module
;
}
bool
is_special
();
bool
is_special
();
bool
is_root
();
bool
is_root
();
string
get_path
();
string
get_path
();
...
@@ -83,12 +83,16 @@ private:
...
@@ -83,12 +83,16 @@ private:
int
get_path
(
char
*
path
);
int
get_path
(
char
*
path
);
};
};
bool
node_entry
::
vendor_root
=
false
;
bool
node_entry
::
product_root
=
false
;
node_entry
::~
node_entry
()
{
node_entry
::~
node_entry
()
{
for
(
auto
&
node
:
children
)
for
(
auto
&
node
:
children
)
delete
node
;
delete
node
;
}
}
#define SPECIAL_NODE (parent->parent ? false : (name == "vendor" || name == "product"))
#define SPECIAL_NODE (parent->parent ? false : \
((vendor_root && name == "vendor") || (product_root && name == "product")))
bool
node_entry
::
is_special
()
{
bool
node_entry
::
is_special
()
{
return
parent
?
SPECIAL_NODE
:
false
;
return
parent
?
SPECIAL_NODE
:
false
;
...
@@ -139,7 +143,7 @@ void node_entry::create_module_tree(const char *module) {
...
@@ -139,7 +143,7 @@ void node_entry::create_module_tree(const char *module) {
return
;
return
;
while
((
entry
=
xreaddir
(
dir
)))
{
while
((
entry
=
xreaddir
(
dir
)))
{
if
(
strcmp
(
entry
->
d_name
,
"."
)
==
0
||
strcmp
(
entry
->
d_name
,
".."
)
==
0
)
if
(
entry
->
d_name
==
"."
sv
||
entry
->
d_name
==
".."
sv
)
continue
;
continue
;
// Create new node
// Create new node
auto
node
=
new
node_entry
(
this
,
module
,
entry
->
d_name
,
entry
->
d_type
);
auto
node
=
new
node_entry
(
this
,
module
,
entry
->
d_name
,
entry
->
d_type
);
...
@@ -150,11 +154,10 @@ void node_entry::create_module_tree(const char *module) {
...
@@ -150,11 +154,10 @@ void node_entry::create_module_tree(const char *module) {
module
,
full_path
.
c_str
(),
entry
->
d_name
);
module
,
full_path
.
c_str
(),
entry
->
d_name
);
/*
/*
* Clone current node directory in the following condition:
* Clone current directory in one of the following conditions:
* 1. We are not a root node
* - Target does not exist
* 2. Target does not exist or
* - Module file is a symlink
* 3. Module file is a symlink or
* - Target file is a symlink (exclude special nodes)
* 4. Target file is a symlink (exclude special nodes)
*/
*/
bool
clone
=
false
;
bool
clone
=
false
;
if
(
IS_LNK
(
node
)
||
access
(
buf
,
F_OK
)
==
-
1
)
{
if
(
IS_LNK
(
node
)
||
access
(
buf
,
F_OK
)
==
-
1
)
{
...
@@ -209,7 +212,6 @@ void node_entry::create_module_tree(const char *module) {
...
@@ -209,7 +212,6 @@ void node_entry::create_module_tree(const char *module) {
void
node_entry
::
clone_skeleton
()
{
void
node_entry
::
clone_skeleton
()
{
DIR
*
dir
;
DIR
*
dir
;
struct
dirent
*
entry
;
struct
dirent
*
entry
;
node_entry
*
dummy
;
// Clone the structure
// Clone the structure
auto
full_path
=
get_path
();
auto
full_path
=
get_path
();
...
@@ -217,10 +219,10 @@ void node_entry::clone_skeleton() {
...
@@ -217,10 +219,10 @@ void node_entry::clone_skeleton() {
if
(
!
(
dir
=
xopendir
(
buf
)))
if
(
!
(
dir
=
xopendir
(
buf
)))
return
;
return
;
while
((
entry
=
xreaddir
(
dir
)))
{
while
((
entry
=
xreaddir
(
dir
)))
{
if
(
strcmp
(
entry
->
d_name
,
"."
)
==
0
||
strcmp
(
entry
->
d_name
,
".."
)
==
0
)
if
(
entry
->
d_name
==
"."
sv
||
entry
->
d_name
==
".."
sv
)
continue
;
continue
;
// Create dummy node
// Create dummy node
dummy
=
new
node_entry
(
entry
->
d_name
,
IS_DUMMY
,
entry
->
d_type
);
auto
dummy
=
new
node_entry
(
entry
->
d_name
,
entry
->
d_type
,
IS_DUMMY
);
insert
(
dummy
);
insert
(
dummy
);
}
}
closedir
(
dir
);
closedir
(
dir
);
...
@@ -422,7 +424,7 @@ static void prepare_modules() {
...
@@ -422,7 +424,7 @@ static void prepare_modules() {
if
((
dir
=
opendir
(
MODULEUPGRADE
)))
{
if
((
dir
=
opendir
(
MODULEUPGRADE
)))
{
while
((
entry
=
xreaddir
(
dir
)))
{
while
((
entry
=
xreaddir
(
dir
)))
{
if
(
entry
->
d_type
==
DT_DIR
)
{
if
(
entry
->
d_type
==
DT_DIR
)
{
if
(
strcmp
(
entry
->
d_name
,
"."
)
==
0
||
strcmp
(
entry
->
d_name
,
".."
)
==
0
)
if
(
entry
->
d_name
==
"."
sv
||
entry
->
d_name
==
".."
sv
)
continue
;
continue
;
// Cleanup old module if exists
// Cleanup old module if exists
snprintf
(
buf
,
sizeof
(
buf
),
"%s/%s"
,
MODULEROOT
,
entry
->
d_name
);
snprintf
(
buf
,
sizeof
(
buf
),
"%s/%s"
,
MODULEROOT
,
entry
->
d_name
);
...
@@ -441,6 +443,9 @@ static void prepare_modules() {
...
@@ -441,6 +443,9 @@ static void prepare_modules() {
xmkdir
(
LEGACYCORE
,
0755
);
xmkdir
(
LEGACYCORE
,
0755
);
symlink
(
SECURE_DIR
"/post-fs-data.d"
,
LEGACYCORE
"/post-fs-data.d"
);
symlink
(
SECURE_DIR
"/post-fs-data.d"
,
LEGACYCORE
"/post-fs-data.d"
);
symlink
(
SECURE_DIR
"/service.d"
,
LEGACYCORE
"/service.d"
);
symlink
(
SECURE_DIR
"/service.d"
,
LEGACYCORE
"/service.d"
);
restorecon
();
chmod
(
SECURE_DIR
,
0700
);
}
}
static
void
collect_modules
()
{
static
void
collect_modules
()
{
...
@@ -450,9 +455,7 @@ static void collect_modules() {
...
@@ -450,9 +455,7 @@ static void collect_modules() {
struct
dirent
*
entry
;
struct
dirent
*
entry
;
while
((
entry
=
xreaddir
(
dir
)))
{
while
((
entry
=
xreaddir
(
dir
)))
{
if
(
entry
->
d_type
==
DT_DIR
)
{
if
(
entry
->
d_type
==
DT_DIR
)
{
if
(
strcmp
(
entry
->
d_name
,
"."
)
==
0
||
if
(
entry
->
d_name
==
"."
sv
||
entry
->
d_name
==
".."
sv
||
entry
->
d_name
==
".core"
sv
)
strcmp
(
entry
->
d_name
,
".."
)
==
0
||
strcmp
(
entry
->
d_name
,
".core"
)
==
0
)
continue
;
continue
;
chdir
(
entry
->
d_name
);
chdir
(
entry
->
d_name
);
if
(
access
(
"remove"
,
F_OK
)
==
0
)
{
if
(
access
(
"remove"
,
F_OK
)
==
0
)
{
...
@@ -615,9 +618,6 @@ void post_fs_data(int client) {
...
@@ -615,9 +618,6 @@ void post_fs_data(int client) {
prepare_modules
();
prepare_modules
();
restorecon
();
chmod
(
SECURE_DIR
,
0700
);
// Core only mode
// Core only mode
if
(
access
(
DISABLEFILE
,
F_OK
)
==
0
)
if
(
access
(
DISABLEFILE
,
F_OK
)
==
0
)
core_only
();
core_only
();
...
@@ -632,8 +632,11 @@ void post_fs_data(int client) {
...
@@ -632,8 +632,11 @@ void post_fs_data(int client) {
module_list
.
clear
();
module_list
.
clear
();
collect_modules
();
collect_modules
();
node_entry
::
vendor_root
=
access
(
"/vendor"
,
F_OK
)
==
0
;
node_entry
::
product_root
=
access
(
"/product"
,
F_OK
)
==
0
;
// Create the system root entry
// Create the system root entry
auto
sys_root
=
new
node_entry
(
"system"
,
IS_INTER
);
auto
sys_root
=
new
node_entry
(
"system"
);
bool
has_modules
=
false
;
bool
has_modules
=
false
;
...
@@ -660,14 +663,14 @@ void post_fs_data(int client) {
...
@@ -660,14 +663,14 @@ void post_fs_data(int client) {
LOGI
(
"%s: constructing magic mount structure
\n
"
,
module
);
LOGI
(
"%s: constructing magic mount structure
\n
"
,
module
);
// If /system/vendor exists in module, create a link outside
// If /system/vendor exists in module, create a link outside
snprintf
(
buf
,
PATH_MAX
,
"%s/%s/system/vendor"
,
MODULEROOT
,
module
);
snprintf
(
buf
,
PATH_MAX
,
"%s/%s/system/vendor"
,
MODULEROOT
,
module
);
if
(
access
(
buf
,
F_OK
)
==
0
)
{
if
(
node_entry
::
vendor_root
&&
access
(
buf
,
F_OK
)
==
0
)
{
snprintf
(
buf2
,
PATH_MAX
,
"%s/%s/vendor"
,
MODULEROOT
,
module
);
snprintf
(
buf2
,
PATH_MAX
,
"%s/%s/vendor"
,
MODULEROOT
,
module
);
unlink
(
buf2
);
unlink
(
buf2
);
xsymlink
(
"./system/vendor"
,
buf2
);
xsymlink
(
"./system/vendor"
,
buf2
);
}
}
// If /system/product exists in module, create a link outside
// If /system/product exists in module, create a link outside
snprintf
(
buf
,
PATH_MAX
,
"%s/%s/system/product"
,
MODULEROOT
,
module
);
snprintf
(
buf
,
PATH_MAX
,
"%s/%s/system/product"
,
MODULEROOT
,
module
);
if
(
access
(
buf
,
F_OK
)
==
0
)
{
if
(
node_entry
::
product_root
&&
access
(
buf
,
F_OK
)
==
0
)
{
snprintf
(
buf2
,
PATH_MAX
,
"%s/%s/product"
,
MODULEROOT
,
module
);
snprintf
(
buf2
,
PATH_MAX
,
"%s/%s/product"
,
MODULEROOT
,
module
);
unlink
(
buf2
);
unlink
(
buf2
);
xsymlink
(
"./system/product"
,
buf2
);
xsymlink
(
"./system/product"
,
buf2
);
...
@@ -678,11 +681,11 @@ void post_fs_data(int client) {
...
@@ -678,11 +681,11 @@ void post_fs_data(int client) {
if
(
has_modules
)
{
if
(
has_modules
)
{
// Pull out special nodes if exist
// Pull out special nodes if exist
node_entry
*
special
;
node_entry
*
special
;
if
((
special
=
sys_root
->
extract
(
"vendor"
)))
{
if
(
node_entry
::
vendor_root
&&
(
special
=
sys_root
->
extract
(
"vendor"
)))
{
special
->
magic_mount
();
special
->
magic_mount
();
delete
special
;
delete
special
;
}
}
if
((
special
=
sys_root
->
extract
(
"product"
)))
{
if
(
node_entry
::
product_root
&&
(
special
=
sys_root
->
extract
(
"product"
)))
{
special
->
magic_mount
();
special
->
magic_mount
();
delete
special
;
delete
special
;
}
}
...
...
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