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
3d269fe8
Commit
3d269fe8
authored
Nov 08, 2018
by
topjohnwu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Migrate MagiskInit to C++
parent
be5f00aa
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
564 additions
and
209 deletions
+564
-209
Android.mk
native/jni/Android.mk
+4
-4
magiskrc.h
native/jni/include/magiskrc.h
+5
-5
api.cpp
native/jni/magiskpolicy/api.cpp
+16
-16
magiskpolicy.cpp
native/jni/magiskpolicy/magiskpolicy.cpp
+462
-0
magiskpolicy.h
native/jni/magiskpolicy/magiskpolicy.h
+21
-13
rules.cpp
native/jni/magiskpolicy/rules.cpp
+1
-1
sepolicy.c
native/jni/magiskpolicy/sepolicy.c
+15
-14
sepolicy.h
native/jni/magiskpolicy/sepolicy.h
+16
-7
init.cpp
native/jni/misc/init.cpp
+23
-18
Android.mk
native/jni/utils/Android.mk
+1
-2
vector.h
native/jni/utils/include/vector.h
+0
-38
vector.c
native/jni/utils/vector.c
+0
-91
No files found.
native/jni/Android.mk
View file @
3d269fe8
...
...
@@ -73,10 +73,10 @@ LOCAL_C_INCLUDES := \
$(LIBUTILS)
LOCAL_SRC_FILES := \
misc/init.c \
magiskpolicy/api.c \
magiskpolicy/magiskpolicy.c \
magiskpolicy/rules.c \
misc/init.c
pp
\
magiskpolicy/api.c
pp
\
magiskpolicy/magiskpolicy.c
pp
\
magiskpolicy/rules.c
pp
\
magiskpolicy/sepolicy.c
LOCAL_LDFLAGS := -static
...
...
native/jni/include/magiskrc.h
View file @
3d269fe8
...
...
@@ -6,22 +6,22 @@ static const char magiskrc[] =
"on post-fs-data
\n
"
" start logd
\n
"
" load_persist_props
\n
"
" rm "
UNBLOCKFILE
"
\n
"
" rm "
UNBLOCKFILE
"
\n
"
" start %s
\n
"
" wait "
UNBLOCKFILE
" 10
\n
"
" rm "
UNBLOCKFILE
"
\n
"
" wait "
UNBLOCKFILE
" 10
\n
"
" rm "
UNBLOCKFILE
"
\n
"
"
\n
"
"service %s /sbin/magisk --startup
\n
"
" user root
\n
"
" seclabel u:r:"
SEPOL_PROC_DOMAIN
":s0
\n
"
" seclabel u:r:"
SEPOL_PROC_DOMAIN
":s0
\n
"
" oneshot
\n
"
"
\n
"
"service %s /sbin/magisk --service
\n
"
" class late_start
\n
"
" user root
\n
"
" seclabel u:r:"
SEPOL_PROC_DOMAIN
":s0
\n
"
" seclabel u:r:"
SEPOL_PROC_DOMAIN
":s0
\n
"
" oneshot
\n
"
"
\n
"
...
...
native/jni/magiskpolicy/api.c
→
native/jni/magiskpolicy/api.c
pp
View file @
3d269fe8
#include "magiskpolicy.h"
#include "sepolicy.h"
int
sepol_allow
(
c
har
*
s
,
char
*
t
,
char
*
c
,
char
*
p
)
{
//
printf("allow %s %s %s %s\n", s, t, c, p);
int
sepol_allow
(
c
onst
char
*
s
,
const
char
*
t
,
const
char
*
c
,
const
char
*
p
)
{
//
printf("allow %s %s %s %s\n", s, t, c, p);
return
add_rule
(
s
,
t
,
c
,
p
,
AVTAB_ALLOWED
,
0
);
}
int
sepol_deny
(
c
har
*
s
,
char
*
t
,
char
*
c
,
char
*
p
)
{
int
sepol_deny
(
c
onst
char
*
s
,
const
char
*
t
,
const
char
*
c
,
const
char
*
p
)
{
// printf("deny %s %s %s %s\n", s, t, c, p);
return
add_rule
(
s
,
t
,
c
,
p
,
AVTAB_ALLOWED
,
1
);
}
int
sepol_auditallow
(
c
har
*
s
,
char
*
t
,
char
*
c
,
char
*
p
)
{
int
sepol_auditallow
(
c
onst
char
*
s
,
const
char
*
t
,
const
char
*
c
,
const
char
*
p
)
{
// printf("auditallow %s %s %s %s\n", s, t, c, p);
return
add_rule
(
s
,
t
,
c
,
p
,
AVTAB_AUDITALLOW
,
0
);
}
int
sepol_auditdeny
(
c
har
*
s
,
char
*
t
,
char
*
c
,
char
*
p
)
{
int
sepol_auditdeny
(
c
onst
char
*
s
,
const
char
*
t
,
const
char
*
c
,
const
char
*
p
)
{
// printf("auditdeny %s %s %s %s\n", s, t, c, p);
return
add_rule
(
s
,
t
,
c
,
p
,
AVTAB_AUDITDENY
,
0
);
}
int
sepol_typetrans
(
c
har
*
s
,
char
*
t
,
char
*
c
,
char
*
d
,
char
*
o
)
{
if
(
o
==
NULL
)
{
int
sepol_typetrans
(
c
onst
char
*
s
,
const
char
*
t
,
const
char
*
c
,
const
char
*
d
,
const
char
*
o
)
{
if
(
o
==
nullptr
)
{
// printf("add_trans %s %s %s %s\n", s, t, c ,d);
return
add_transition
(
s
,
t
,
c
,
d
);
}
else
{
...
...
@@ -31,41 +31,41 @@ int sepol_typetrans(char *s, char *t, char *c, char *d, char *o) {
}
}
int
sepol_allowxperm
(
c
har
*
s
,
char
*
t
,
char
*
c
,
char
*
range
)
{
int
sepol_allowxperm
(
c
onst
char
*
s
,
const
char
*
t
,
const
char
*
c
,
const
char
*
range
)
{
// printf("allowxperm %s %s %s %s\n", s, t, c, range);
return
add_xperm_rule
(
s
,
t
,
c
,
range
,
AVTAB_XPERMS_ALLOWED
,
0
);
}
int
sepol_auditallowxperm
(
c
har
*
s
,
char
*
t
,
char
*
c
,
char
*
range
)
{
int
sepol_auditallowxperm
(
c
onst
char
*
s
,
const
char
*
t
,
const
char
*
c
,
const
char
*
range
)
{
// printf("auditallowxperm %s %s %s %s\n", s, t, c, range);
return
add_xperm_rule
(
s
,
t
,
c
,
range
,
AVTAB_XPERMS_AUDITALLOW
,
0
);
}
int
sepol_dontauditxperm
(
c
har
*
s
,
char
*
t
,
char
*
c
,
char
*
range
)
{
int
sepol_dontauditxperm
(
c
onst
char
*
s
,
const
char
*
t
,
const
char
*
c
,
const
char
*
range
)
{
// printf("dontauditxperm %s %s %s %s\n", s, t, c, range);
return
add_xperm_rule
(
s
,
t
,
c
,
range
,
AVTAB_XPERMS_DONTAUDIT
,
0
);
}
int
sepol_permissive
(
char
*
s
)
{
int
sepol_permissive
(
c
onst
c
har
*
s
)
{
// printf("permissive %s\n", s);
return
set_domain_state
(
s
,
1
);
}
int
sepol_enforce
(
char
*
s
)
{
int
sepol_enforce
(
c
onst
c
har
*
s
)
{
// printf("enforce %s\n", s);
return
set_domain_state
(
s
,
0
);
}
int
sepol_create
(
char
*
s
)
{
int
sepol_create
(
c
onst
c
har
*
s
)
{
// printf("create %s\n", s);
return
create_domain
(
s
);
}
int
sepol_attradd
(
c
har
*
s
,
char
*
a
)
{
int
sepol_attradd
(
c
onst
char
*
s
,
const
char
*
a
)
{
// printf("attradd %s %s\n", s, a);
return
add_typeattribute
(
s
,
a
);
}
int
sepol_exists
(
c
har
*
source
)
{
return
!!
hashtab_search
(
policydb
->
p_types
.
table
,
source
)
;
int
sepol_exists
(
c
onst
char
*
source
)
{
return
hashtab_search
(
policydb
->
p_types
.
table
,
source
)
!=
nullptr
;
}
native/jni/magiskpolicy/magiskpolicy.c
→
native/jni/magiskpolicy/magiskpolicy.c
pp
View file @
3d269fe8
This diff is collapsed.
Click to expand it.
native/jni/magiskpolicy/magiskpolicy.h
View file @
3d269fe8
...
...
@@ -16,6 +16,10 @@
#define SPLIT_PRECOMPILE NONPLAT_POLICY_DIR "precompiled_sepolicy"
#define SPLIT_NONPLAT_VER NONPLAT_POLICY_DIR "plat_sepolicy_vers.txt"
#ifdef __cplusplus
extern
"C"
{
#endif
// policydb functions
int
load_policydb
(
const
char
*
filename
);
int
compile_split_cil
();
...
...
@@ -23,21 +27,25 @@ int dump_policydb(const char *filename);
void
destroy_policydb
();
// Handy functions
int
sepol_allow
(
c
har
*
s
,
char
*
t
,
char
*
c
,
char
*
p
);
int
sepol_deny
(
c
har
*
s
,
char
*
t
,
char
*
c
,
char
*
p
);
int
sepol_auditallow
(
c
har
*
s
,
char
*
t
,
char
*
c
,
char
*
p
);
int
sepol_auditdeny
(
c
har
*
s
,
char
*
t
,
char
*
c
,
char
*
p
);
int
sepol_typetrans
(
c
har
*
s
,
char
*
t
,
char
*
c
,
char
*
d
,
char
*
o
);
int
sepol_allowxperm
(
c
har
*
s
,
char
*
t
,
char
*
c
,
char
*
range
);
int
sepol_auditallowxperm
(
c
har
*
s
,
char
*
t
,
char
*
c
,
char
*
range
);
int
sepol_dontauditxperm
(
c
har
*
s
,
char
*
t
,
char
*
c
,
char
*
range
);
int
sepol_create
(
char
*
s
);
int
sepol_permissive
(
char
*
s
);
int
sepol_enforce
(
char
*
s
);
int
sepol_attradd
(
c
har
*
s
,
char
*
a
);
int
sepol_exists
(
char
*
source
);
int
sepol_allow
(
c
onst
char
*
s
,
const
char
*
t
,
const
char
*
c
,
const
char
*
p
);
int
sepol_deny
(
c
onst
char
*
s
,
const
char
*
t
,
const
char
*
c
,
const
char
*
p
);
int
sepol_auditallow
(
c
onst
char
*
s
,
const
char
*
t
,
const
char
*
c
,
const
char
*
p
);
int
sepol_auditdeny
(
c
onst
char
*
s
,
const
char
*
t
,
const
char
*
c
,
const
char
*
p
);
int
sepol_typetrans
(
c
onst
char
*
s
,
const
char
*
t
,
const
char
*
c
,
const
char
*
d
,
const
char
*
o
);
int
sepol_allowxperm
(
c
onst
char
*
s
,
const
char
*
t
,
const
char
*
c
,
const
char
*
range
);
int
sepol_auditallowxperm
(
c
onst
char
*
s
,
const
char
*
t
,
const
char
*
c
,
const
char
*
range
);
int
sepol_dontauditxperm
(
c
onst
char
*
s
,
const
char
*
t
,
const
char
*
c
,
const
char
*
range
);
int
sepol_create
(
c
onst
c
har
*
s
);
int
sepol_permissive
(
c
onst
c
har
*
s
);
int
sepol_enforce
(
c
onst
c
har
*
s
);
int
sepol_attradd
(
c
onst
char
*
s
,
const
char
*
a
);
int
sepol_exists
(
c
onst
c
har
*
source
);
// Built in rules
void
sepol_magisk_rules
();
#ifdef __cplusplus
};
#endif
#endif
native/jni/magiskpolicy/rules.c
→
native/jni/magiskpolicy/rules.c
pp
View file @
3d269fe8
...
...
@@ -2,7 +2,7 @@
#include "magiskpolicy.h"
#include "sepolicy.h"
static
void
allowSuClient
(
char
*
target
)
{
static
void
allowSuClient
(
c
onst
c
har
*
target
)
{
if
(
!
sepol_exists
(
target
))
return
;
sepol_allow
(
target
,
SEPOL_PROC_DOMAIN
,
"unix_stream_socket"
,
"connectto"
);
...
...
native/jni/magiskpolicy/sepolicy.c
View file @
3d269fe8
...
...
@@ -22,7 +22,6 @@
#include "utils.h"
#include "magiskpolicy.h"
#include "sepolicy.h"
#include "vector.h"
policydb_t
*
policydb
=
NULL
;
extern
int
policydb_index_decls
(
sepol_handle_t
*
handle
,
policydb_t
*
p
);
...
...
@@ -36,7 +35,7 @@ static void *cmalloc(size_t s) {
return
t
;
}
static
int
get_attr
(
char
*
type
,
int
value
)
{
static
int
get_attr
(
c
onst
c
har
*
type
,
int
value
)
{
type_datum_t
*
attr
=
hashtab_search
(
policydb
->
p_types
.
table
,
type
);
if
(
!
attr
)
return
1
;
...
...
@@ -47,7 +46,7 @@ static int get_attr(char *type, int value) {
return
!!
ebitmap_get_bit
(
&
policydb
->
attr_type_map
[
attr
->
s
.
value
-
1
],
value
-
1
);
}
static
int
get_attr_id
(
char
*
type
)
{
static
int
get_attr_id
(
c
onst
c
har
*
type
)
{
type_datum_t
*
attr
=
hashtab_search
(
policydb
->
p_types
.
table
,
type
);
if
(
!
attr
)
return
1
;
...
...
@@ -58,7 +57,7 @@ static int get_attr_id(char *type) {
return
attr
->
s
.
value
;
}
static
int
set_attr
(
char
*
type
,
int
value
)
{
static
int
set_attr
(
c
onst
c
har
*
type
,
int
value
)
{
type_datum_t
*
attr
=
hashtab_search
(
policydb
->
p_types
.
table
,
type
);
if
(
!
attr
)
return
1
;
...
...
@@ -364,7 +363,7 @@ void destroy_policydb() {
policydb
=
NULL
;
}
int
create_domain
(
char
*
d
)
{
int
create_domain
(
c
onst
c
har
*
d
)
{
symtab_datum_t
*
src
=
hashtab_search
(
policydb
->
p_types
.
table
,
d
);
if
(
src
)
{
fprintf
(
stderr
,
"Domain %s already exists
\n
"
,
d
);
...
...
@@ -414,7 +413,7 @@ int create_domain(char *d) {
return
set_attr
(
"domain"
,
value
);
}
int
set_domain_state
(
c
har
*
s
,
int
state
)
{
int
set_domain_state
(
c
onst
char
*
s
,
int
state
)
{
type_datum_t
*
type
;
hashtab_ptr_t
cur
;
if
(
s
==
NULL
)
{
...
...
@@ -440,7 +439,7 @@ int set_domain_state(char* s, int state) {
return
0
;
}
int
add_transition
(
c
har
*
s
,
char
*
t
,
char
*
c
,
char
*
d
)
{
int
add_transition
(
c
onst
char
*
s
,
const
char
*
t
,
const
char
*
c
,
const
char
*
d
)
{
type_datum_t
*
src
,
*
tgt
,
*
def
;
class_datum_t
*
cls
;
...
...
@@ -491,7 +490,8 @@ int add_transition(char *s, char *t, char *c, char *d) {
return
0
;
}
int
add_file_transition
(
char
*
s
,
char
*
t
,
char
*
c
,
char
*
d
,
char
*
filename
)
{
int
add_file_transition
(
const
char
*
s
,
const
char
*
t
,
const
char
*
c
,
const
char
*
d
,
const
char
*
filename
)
{
type_datum_t
*
src
,
*
tgt
,
*
def
;
class_datum_t
*
cls
;
...
...
@@ -520,7 +520,7 @@ int add_file_transition(char *s, char *t, char *c, char *d, char* filename) {
trans_key
.
stype
=
src
->
s
.
value
;
trans_key
.
ttype
=
tgt
->
s
.
value
;
trans_key
.
tclass
=
cls
->
s
.
value
;
trans_key
.
name
=
filename
;
trans_key
.
name
=
(
char
*
)
filename
;
filename_trans_datum_t
*
trans_datum
;
trans_datum
=
hashtab_search
(
policydb
->
p_types
.
table
,
(
hashtab_key_t
)
&
trans_key
);
...
...
@@ -535,7 +535,7 @@ int add_file_transition(char *s, char *t, char *c, char *d, char* filename) {
return
0
;
}
int
add_typeattribute
(
c
har
*
domainS
,
char
*
attr
)
{
int
add_typeattribute
(
c
onst
char
*
domainS
,
const
char
*
attr
)
{
type_datum_t
*
domain
;
domain
=
hashtab_search
(
policydb
->
p_types
.
table
,
domainS
);
...
...
@@ -564,7 +564,7 @@ int add_typeattribute(char *domainS, char *attr) {
return
0
;
}
int
add_rule
(
c
har
*
s
,
char
*
t
,
char
*
c
,
char
*
p
,
int
effect
,
int
not
)
{
int
add_rule
(
c
onst
char
*
s
,
const
char
*
t
,
const
char
*
c
,
const
char
*
p
,
int
effect
,
int
n
)
{
type_datum_t
*
src
=
NULL
,
*
tgt
=
NULL
;
class_datum_t
*
cls
=
NULL
;
perm_datum_t
*
perm
=
NULL
;
...
...
@@ -610,10 +610,11 @@ int add_rule(char *s, char *t, char *c, char *p, int effect, int not) {
}
}
}
return
add_rule_auto
(
src
,
tgt
,
cls
,
perm
,
effect
,
n
ot
);
return
add_rule_auto
(
src
,
tgt
,
cls
,
perm
,
effect
,
n
);
}
int
add_xperm_rule
(
char
*
s
,
char
*
t
,
char
*
c
,
char
*
range
,
int
effect
,
int
not
)
{
int
add_xperm_rule
(
const
char
*
s
,
const
char
*
t
,
const
char
*
c
,
const
char
*
range
,
int
effect
,
int
n
)
{
type_datum_t
*
src
=
NULL
,
*
tgt
=
NULL
;
class_datum_t
*
cls
=
NULL
;
...
...
@@ -655,5 +656,5 @@ int add_xperm_rule(char *s, char *t, char *c, char *range, int effect, int not)
high
=
0xFFFF
;
}
return
add_xperm_rule_auto
(
src
,
tgt
,
cls
,
low
,
high
,
effect
,
n
ot
);
return
add_xperm_rule_auto
(
src
,
tgt
,
cls
,
low
,
high
,
effect
,
n
);
}
native/jni/magiskpolicy/sepolicy.h
View file @
3d269fe8
...
...
@@ -6,6 +6,10 @@
#include <sepol/policydb/policydb.h>
#ifdef __cplusplus
extern
"C"
{
#endif
// Global policydb
extern
policydb_t
*
policydb
;
...
...
@@ -15,12 +19,17 @@ extern policydb_t *policydb;
for (*ptr = table->htable[_i]; *ptr != NULL; *ptr = (*ptr)->next)
// sepolicy manipulation functions
int
create_domain
(
char
*
d
);
int
set_domain_state
(
char
*
s
,
int
state
);
int
add_transition
(
char
*
s
,
char
*
t
,
char
*
c
,
char
*
d
);
int
add_file_transition
(
char
*
s
,
char
*
t
,
char
*
c
,
char
*
d
,
char
*
filename
);
int
add_typeattribute
(
char
*
domainS
,
char
*
attr
);
int
add_rule
(
char
*
s
,
char
*
t
,
char
*
c
,
char
*
p
,
int
effect
,
int
not
);
int
add_xperm_rule
(
char
*
s
,
char
*
t
,
char
*
c
,
char
*
range
,
int
effect
,
int
not
);
int
create_domain
(
const
char
*
d
);
int
set_domain_state
(
const
char
*
s
,
int
state
);
int
add_transition
(
const
char
*
s
,
const
char
*
t
,
const
char
*
c
,
const
char
*
d
);
int
add_file_transition
(
const
char
*
s
,
const
char
*
t
,
const
char
*
c
,
const
char
*
d
,
const
char
*
filename
);
int
add_typeattribute
(
const
char
*
domainS
,
const
char
*
attr
);
int
add_rule
(
const
char
*
s
,
const
char
*
t
,
const
char
*
c
,
const
char
*
p
,
int
effect
,
int
n
);
int
add_xperm_rule
(
const
char
*
s
,
const
char
*
t
,
const
char
*
c
,
const
char
*
range
,
int
effect
,
int
n
);
#ifdef __cplusplus
};
#endif
#endif
native/jni/misc/init.c
→
native/jni/misc/init.c
pp
View file @
3d269fe8
/* init.c - Pre-init Magisk support
/* init.c
pp
- Pre-init Magisk support
*
* This code has to be compiled statically to work properly.
*
...
...
@@ -21,7 +21,6 @@
*/
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
...
...
@@ -42,8 +41,9 @@
#include "binaries_arch.h"
#include "magiskrc.h"
#include "utils.h"
#include "magisk.h"
#include "magiskpolicy.h"
#include "utils.h"
#include "flags.h"
#define DEFAULT_DT_DIR "/proc/device-tree/firmware/android"
...
...
@@ -223,9 +223,9 @@ static int patch_sepolicy() {
if
(
init_patch
)
{
// Force init to load /sepolicy
void
*
addr
;
uint8_t
*
addr
;
size_t
size
;
mmap_rw
(
"/init"
,
&
addr
,
&
size
);
mmap_rw
(
"/init"
,
(
void
**
)
&
addr
,
&
size
);
for
(
int
i
=
0
;
i
<
size
;
++
i
)
{
if
(
memcmp
(
addr
+
i
,
SPLIT_PLAT_CIL
,
sizeof
(
SPLIT_PLAT_CIL
)
-
1
)
==
0
)
{
memcpy
(
addr
+
i
+
sizeof
(
SPLIT_PLAT_CIL
)
-
4
,
"xxx"
,
3
);
...
...
@@ -238,7 +238,7 @@ static int patch_sepolicy() {
return
0
;
}
static
int
unxz
(
int
fd
,
const
void
*
buf
,
size_t
size
)
{
static
int
unxz
(
int
fd
,
const
uint8_t
*
buf
,
size_t
size
)
{
uint8_t
out
[
8192
];
xz_crc32_init
();
struct
xz_dec
*
dec
=
xz_dec_init
(
XZ_DYNALLOC
,
1
<<
26
);
...
...
@@ -297,10 +297,10 @@ static int dump_magiskrc(const char *path, mode_t mode) {
}
static
void
patch_socket_name
(
const
char
*
path
)
{
void
*
buf
;
uint8_t
*
buf
;
char
name
[
sizeof
(
MAIN_SOCKET
)];
size_t
size
;
mmap_rw
(
path
,
&
buf
,
&
size
);
mmap_rw
(
path
,
(
void
**
)
&
buf
,
&
size
);
for
(
int
i
=
0
;
i
<
size
;
++
i
)
{
if
(
memcmp
(
buf
+
i
,
MAIN_SOCKET
,
sizeof
(
MAIN_SOCKET
))
==
0
)
{
gen_rand_str
(
name
,
sizeof
(
name
));
...
...
@@ -364,8 +364,8 @@ int main(int argc, char *argv[]) {
* ***********/
int
root
=
open
(
"/"
,
O_RDONLY
|
O_CLOEXEC
);
int
mnt_system
=
0
;
int
mnt_vendor
=
0
;
bool
mnt_system
=
false
;
bool
mnt_vendor
=
false
;
if
(
cmd
.
skip_initramfs
)
{
// Clear rootfs
...
...
@@ -407,21 +407,26 @@ int main(int argc, char *argv[]) {
}
else
if
(
read_fstab_dt
(
&
cmd
,
"system"
,
partname
)
==
0
)
{
setup_block
(
&
dev
,
partname
);
xmount
(
dev
.
path
,
"/system"
,
"ext4"
,
MS_RDONLY
,
NULL
);
mnt_system
=
1
;
mnt_system
=
true
;
}
if
(
read_fstab_dt
(
&
cmd
,
"vendor"
,
partname
)
==
0
)
{
setup_block
(
&
dev
,
partname
);
xmount
(
dev
.
path
,
"/vendor"
,
"ext4"
,
MS_RDONLY
,
NULL
);
mnt_vendor
=
1
;
mnt_vendor
=
true
;
}
/* ****************
* Ramdisk Patches
* ****************/
int
fd
;
bool
injected
;
FILE
*
fp
;
char
tok
[
4096
];
// Handle ramdisk overlays
int
fd
=
open
(
"/overlay"
,
O_RDONLY
|
O_CLOEXEC
);
fd
=
open
(
"/overlay"
,
O_RDONLY
|
O_CLOEXEC
);
if
(
fd
>=
0
)
{
mv_dir
(
fd
,
root
);
close
(
fd
);
...
...
@@ -429,17 +434,17 @@ int main(int argc, char *argv[]) {
}
// Patch init.rc to load magisk scripts
int
injected
=
0
;
char
tok
[
4096
]
;
FILE
*
fp
=
xfopen
(
"/init.rc"
,
"r"
);
injected
=
false
;
fp
=
xfopen
(
"/init.rc"
,
"r"
);
fd
=
creat
(
"/init.rc.new"
,
0750
);
while
(
fgets
(
tok
,
sizeof
(
tok
),
fp
))
{
if
(
!
injected
&&
strncmp
(
tok
,
"import"
,
6
)
==
0
)
{
if
(
strstr
(
tok
,
"init.magisk.rc"
))
{
injected
=
1
;
injected
=
true
;
}
else
{
xwrite
(
fd
,
"import /init.magisk.rc
\n
"
,
23
);
injected
=
1
;
injected
=
true
;
}
}
else
if
(
strstr
(
tok
,
"selinux.reload_policy"
))
{
// Do not allow sepolicy patch
...
...
native/jni/utils/Android.mk
View file @
3d269fe8
...
...
@@ -9,7 +9,6 @@ LOCAL_SRC_FILES := \
selinux.cpp \
logging.cpp \
xwrap.cpp \
CharArray.cpp \
vector.c
CharArray.cpp
include $(BUILD_STATIC_LIBRARY)
native/jni/utils/include/vector.h
deleted
100644 → 0
View file @
be5f00aa
/* vector.h - A simple vector implementation in c
*/
#ifndef _VECTOR_H_
#define _VECTOR_H_
#include <sys/types.h>
struct
vector
{
unsigned
size
;
unsigned
cap
;
void
**
data
;
};
void
vec_init
(
struct
vector
*
v
);
void
vec_push_back
(
struct
vector
*
v
,
void
*
p
);
void
vec_push_back_all
(
struct
vector
*
v
,
void
*
p
,
...);
void
*
vec_pop_back
(
struct
vector
*
v
);
void
vec_sort
(
struct
vector
*
v
,
int
(
*
compar
)(
const
void
*
,
const
void
*
));
void
vec_destroy
(
struct
vector
*
v
);
void
vec_deep_destroy
(
struct
vector
*
v
);
void
vec_dup
(
struct
vector
*
v
,
struct
vector
*
vv
);
#define vec_size(v) (v)->size
#define vec_cap(v) (v)->cap
#define vec_entry(v) (v)->data
/* Usage: vec_for_each(vector *v, void *e) */
#define vec_for_each(v, e) \
e = v ? (v)->data[0] : NULL; \
for (int _ = 0; v && _ < (v)->size; ++_, e = (v)->data[_])
#define vec_for_each_r(v, e) \
e = (v && (v)->size > 0) ? (v)->data[(v)->size - 1] : NULL; \
for (int _ = ((int) (v)->size) - 1; v && _ >= 0; --_, e = (v)->data[_])
#define vec_cur(v) vec_entry(v)[_]
#endif
native/jni/utils/vector.c
deleted
100644 → 0
View file @
be5f00aa
/* vector.c - A simple vector implementation in c
*/
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include "vector.h"
void
vec_init
(
struct
vector
*
v
)
{
if
(
v
==
NULL
)
return
;
vec_size
(
v
)
=
0
;
vec_cap
(
v
)
=
1
;
vec_entry
(
v
)
=
malloc
(
sizeof
(
void
*
));
}
void
vec_push_back
(
struct
vector
*
v
,
void
*
p
)
{
if
(
v
==
NULL
)
return
;
if
(
vec_size
(
v
)
==
vec_cap
(
v
))
{
vec_cap
(
v
)
*=
2
;
vec_entry
(
v
)
=
realloc
(
vec_entry
(
v
),
sizeof
(
void
*
)
*
vec_cap
(
v
));
}
vec_entry
(
v
)[
vec_size
(
v
)]
=
p
;
++
vec_size
(
v
);
}
void
vec_push_back_all
(
struct
vector
*
v
,
void
*
p
,
...)
{
va_list
argv
;
va_start
(
argv
,
p
);
vec_push_back
(
v
,
p
);
for
(
void
*
arg
=
va_arg
(
argv
,
char
*
);
arg
;
arg
=
va_arg
(
argv
,
char
*
))
vec_push_back
(
v
,
arg
);
va_end
(
argv
);
}
void
*
vec_pop_back
(
struct
vector
*
v
)
{
void
*
ret
=
vec_entry
(
v
)[
vec_size
(
v
)
-
1
];
--
vec_size
(
v
);
return
ret
;
}
static
int
(
*
cmp
)(
const
void
*
,
const
void
*
);
static
int
vec_comp
(
const
void
*
a
,
const
void
*
b
)
{
void
*
aa
=
*
((
void
**
)
a
),
*
bb
=
*
((
void
**
)
b
);
if
(
aa
==
NULL
&&
bb
==
NULL
)
return
0
;
else
if
(
aa
==
NULL
)
return
1
;
else
if
(
bb
==
NULL
)
return
-
1
;
else
return
cmp
?
cmp
(
aa
,
bb
)
:
0
;
}
void
vec_sort
(
struct
vector
*
v
,
int
(
*
compar
)(
const
void
*
,
const
void
*
))
{
if
(
v
==
NULL
)
return
;
cmp
=
compar
;
qsort
(
vec_entry
(
v
),
vec_size
(
v
),
sizeof
(
void
*
),
vec_comp
);
void
*
e
;
vec_for_each_r
(
v
,
e
)
{
if
(
e
)
break
;
--
vec_size
(
v
);
}
}
/* Will cleanup only the vector itself
* use in cases when each element requires special cleanup
*/
void
vec_destroy
(
struct
vector
*
v
)
{
if
(
v
==
NULL
)
return
;
vec_size
(
v
)
=
0
;
vec_cap
(
v
)
=
0
;
free
(
vec_entry
(
v
));
vec_entry
(
v
)
=
NULL
;
// Prevent double destroy segfault
}
/* Will cleanup each element AND the vector itself
* Shall be the general case
*/
void
vec_deep_destroy
(
struct
vector
*
v
)
{
if
(
v
==
NULL
)
return
;
void
*
e
;
vec_for_each
(
v
,
e
)
{
free
(
e
);
}
vec_destroy
(
v
);
}
void
vec_dup
(
struct
vector
*
v
,
struct
vector
*
vv
)
{
vec_size
(
vv
)
=
vec_size
(
v
);
vec_cap
(
vv
)
=
vec_cap
(
v
);
vec_entry
(
vv
)
=
malloc
(
sizeof
(
void
*
)
*
vec_cap
(
v
));
memcpy
(
vec_entry
(
vv
),
vec_entry
(
v
),
sizeof
(
void
*
)
*
vec_cap
(
v
));
}
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