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
bb9ce0e8
Commit
bb9ce0e8
authored
Nov 20, 2019
by
topjohnwu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Make sepolicy dump more efficient
parent
d6fb9868
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
102 additions
and
11 deletions
+102
-11
policydb.cpp
native/jni/magiskpolicy/policydb.cpp
+17
-11
file.cpp
native/jni/utils/file.cpp
+84
-0
files.h
native/jni/utils/files.h
+1
-0
No files found.
native/jni/magiskpolicy/policydb.cpp
View file @
bb9ce0e8
...
@@ -21,11 +21,12 @@ int load_policydb(const char *file) {
...
@@ -21,11 +21,12 @@ int load_policydb(const char *file) {
pf
.
type
=
PF_USE_STDIO
;
pf
.
type
=
PF_USE_STDIO
;
magisk_policydb
=
static_cast
<
policydb_t
*>
(
xmalloc
(
sizeof
(
policydb_t
)));
magisk_policydb
=
static_cast
<
policydb_t
*>
(
xmalloc
(
sizeof
(
policydb_t
)));
if
(
policydb_init
(
magisk_policydb
)
||
policydb_read
(
magisk_policydb
,
&
pf
,
0
))
if
(
policydb_init
(
magisk_policydb
)
||
policydb_read
(
magisk_policydb
,
&
pf
,
0
))
{
LOGE
(
"Fail to load policy from %s
\n
"
,
file
);
return
1
;
return
1
;
}
fclose
(
pf
.
fp
);
fclose
(
pf
.
fp
);
return
0
;
return
0
;
}
}
...
@@ -172,22 +173,27 @@ int compile_split_cil() {
...
@@ -172,22 +173,27 @@ int compile_split_cil() {
}
}
int
dump_policydb
(
const
char
*
file
)
{
int
dump_policydb
(
const
char
*
file
)
{
int
fd
,
ret
;
struct
policy_file
pf
;
void
*
data
=
nullptr
;
policy_file_init
(
&
pf
);
uint8_t
*
data
;
size_t
len
;
size_t
len
;
policydb_to_image
(
nullptr
,
magisk_policydb
,
&
data
,
&
len
);
if
(
data
==
nullptr
)
{
pf
.
type
=
PF_USE_STDIO
;
LOGE
(
"Fail to dump policy image!
\n
"
);
pf
.
fp
=
open_memfile
(
data
,
len
);
if
(
policydb_write
(
magisk_policydb
,
&
pf
))
{
LOGE
(
"Fail to create policy image
\n
"
);
return
1
;
return
1
;
}
}
fclose
(
pf
.
fp
);
fd
=
xopen
(
file
,
O_WRONLY
|
O_CREAT
|
O_TRUNC
|
O_CLOEXEC
,
0644
);
int
fd
=
xopen
(
file
,
O_WRONLY
|
O_CREAT
|
O_TRUNC
|
O_CLOEXEC
,
0644
);
if
(
fd
<
0
)
if
(
fd
<
0
)
return
1
;
return
1
;
ret
=
xwrite
(
fd
,
data
,
len
);
xwrite
(
fd
,
data
,
len
);
close
(
fd
);
close
(
fd
);
if
(
ret
<
0
)
free
(
data
);
return
1
;
return
0
;
return
0
;
}
}
...
...
native/jni/utils/file.cpp
View file @
bb9ce0e8
...
@@ -407,3 +407,87 @@ void parse_mnt(const char *file, const function<bool (mntent*)> &fn) {
...
@@ -407,3 +407,87 @@ void parse_mnt(const char *file, const function<bool (mntent*)> &fn) {
}
}
}
}
}
}
struct
io_buf
{
uint8_t
*&
buf
;
size_t
&
len
;
size_t
cap
=
0
;
size_t
pos
=
0
;
io_buf
(
uint8_t
*&
buf
,
size_t
&
len
)
:
buf
(
buf
),
len
(
len
)
{
buf
=
nullptr
;
len
=
0
;
}
uint8_t
*
cur
()
{
return
buf
+
pos
;
}
int
max_read
()
{
return
len
-
pos
;
}
void
resize
(
int
new_pos
,
bool
zero
=
false
)
{
bool
resize
=
false
;
size_t
old_cap
=
cap
;
while
(
new_pos
>
cap
)
{
cap
=
cap
?
(
cap
<<
1
)
-
(
cap
>>
1
)
:
1
<<
12
;
resize
=
true
;
}
if
(
resize
)
{
buf
=
(
uint8_t
*
)
xrealloc
(
buf
,
cap
);
if
(
zero
)
memset
(
buf
+
old_cap
,
0
,
cap
-
old_cap
);
}
}
};
static
int
mem_read
(
void
*
v
,
char
*
buf
,
int
len
)
{
auto
io
=
reinterpret_cast
<
io_buf
*>
(
v
);
len
=
std
::
min
(
len
,
io
->
max_read
());
memcpy
(
buf
,
io
->
cur
(),
len
);
return
len
;
}
static
int
mem_write
(
void
*
v
,
const
char
*
buf
,
int
len
)
{
auto
io
=
reinterpret_cast
<
io_buf
*>
(
v
);
io
->
resize
(
io
->
pos
+
len
);
memcpy
(
io
->
cur
(),
buf
,
len
);
io
->
pos
+=
len
;
io
->
len
=
std
::
max
(
io
->
len
,
io
->
pos
);
return
len
;
}
static
fpos_t
mem_seek
(
void
*
v
,
fpos_t
off
,
int
whence
)
{
auto
io
=
reinterpret_cast
<
io_buf
*>
(
v
);
off_t
new_pos
;
switch
(
whence
)
{
case
SEEK_CUR
:
new_pos
=
io
->
pos
+
off
;
break
;
case
SEEK_END
:
new_pos
=
io
->
len
+
off
;
break
;
case
SEEK_SET
:
new_pos
=
off
;
break
;
default:
return
-
1
;
}
if
(
new_pos
<
0
)
return
-
1
;
io
->
resize
(
new_pos
,
true
);
io
->
pos
=
new_pos
;
return
new_pos
;
}
static
int
mem_close
(
void
*
v
)
{
auto
io
=
reinterpret_cast
<
io_buf
*>
(
v
);
delete
io
;
return
0
;
}
FILE
*
open_memfile
(
uint8_t
*&
buf
,
size_t
&
len
)
{
auto
io
=
new
io_buf
(
buf
,
len
);
FILE
*
fp
=
funopen
(
io
,
mem_read
,
mem_write
,
mem_seek
,
mem_close
);
setbuf
(
fp
,
nullptr
);
return
fp
;
}
native/jni/utils/files.h
View file @
bb9ce0e8
...
@@ -38,6 +38,7 @@ void *__mmap(const char *filename, size_t *size, bool rw);
...
@@ -38,6 +38,7 @@ void *__mmap(const char *filename, size_t *size, bool rw);
void
frm_rf
(
int
dirfd
,
std
::
initializer_list
<
const
char
*>
excl
=
std
::
initializer_list
<
const
char
*>
());
void
frm_rf
(
int
dirfd
,
std
::
initializer_list
<
const
char
*>
excl
=
std
::
initializer_list
<
const
char
*>
());
void
clone_dir
(
int
src
,
int
dest
,
bool
overwrite
=
true
);
void
clone_dir
(
int
src
,
int
dest
,
bool
overwrite
=
true
);
void
parse_mnt
(
const
char
*
file
,
const
std
::
function
<
bool
(
mntent
*
)
>
&
fn
);
void
parse_mnt
(
const
char
*
file
,
const
std
::
function
<
bool
(
mntent
*
)
>
&
fn
);
FILE
*
open_memfile
(
uint8_t
*&
buf
,
size_t
&
len
);
template
<
typename
T
>
template
<
typename
T
>
void
full_read
(
const
char
*
filename
,
T
&
buf
,
size_t
&
size
)
{
void
full_read
(
const
char
*
filename
,
T
&
buf
,
size_t
&
size
)
{
...
...
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