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
eee7f097
Commit
eee7f097
authored
Dec 18, 2020
by
topjohnwu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Make post-fs-data scripts block at most 35 secs
parent
086059ec
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
92 additions
and
29 deletions
+92
-29
scripting.cpp
native/jni/core/scripting.cpp
+81
-20
magisk.hpp
native/jni/include/magisk.hpp
+3
-0
magiskrc.inc
native/jni/init/magiskrc.inc
+4
-1
misc.cpp
native/jni/utils/misc.cpp
+3
-7
misc.hpp
native/jni/utils/misc.hpp
+1
-1
No files found.
native/jni/core/scripting.cpp
View file @
eee7f097
#include <unistd.h>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <string>
#include <vector>
#include <vector>
#include <sys/wait.h>
#include <magisk.hpp>
#include <magisk.hpp>
#include <utils.hpp>
#include <utils.hpp>
...
@@ -29,23 +27,66 @@ static void set_script_env() {
...
@@ -29,23 +27,66 @@ static void set_script_env() {
void
exec_script
(
const
char
*
script
)
{
void
exec_script
(
const
char
*
script
)
{
exec_t
exec
{
exec_t
exec
{
.
pre_exec
=
set_script_env
,
.
pre_exec
=
set_script_env
,
.
fork
=
fork_no_
zombie
.
fork
=
fork_no_
orphan
};
};
exec_command_sync
(
exec
,
BBEXEC_CMD
,
script
);
exec_command_sync
(
exec
,
BBEXEC_CMD
,
script
);
}
}
static
timespec
pfs_timeout
;
#define PFS_SETUP() \
if (pfs) { \
if (int pid = xfork()) { \
if (pid < 0) \
return; \
/* In parent process, simply wait for child to finish */
\
waitpid(pid, nullptr, 0); \
return; \
} \
timer_pid = xfork(); \
if (timer_pid == 0) { \
/* In timer process, count down */
\
clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &pfs_timeout, nullptr); \
exit(0); \
} \
}
#define PFS_WAIT() \
if (pfs) { \
/* If we ran out of time, don't block */
\
if (timer_pid < 0) \
continue; \
if (int pid = waitpid(-1, nullptr, 0); pid == timer_pid) { \
LOGW("* post-fs-data scripts blocking phase timeout\n"); \
timer_pid = -1; \
} \
}
#define PFS_DONE() \
if (pfs) { \
if (timer_pid > 0) \
kill(timer_pid, SIGKILL); \
exit(0); \
}
void
exec_common_scripts
(
const
char
*
stage
)
{
void
exec_common_scripts
(
const
char
*
stage
)
{
LOGI
(
"* Running %s.d scripts
\n
"
,
stage
);
LOGI
(
"* Running %s.d scripts
\n
"
,
stage
);
char
path
[
4096
];
char
path
[
4096
];
char
*
name
=
path
+
sprintf
(
path
,
SECURE_DIR
"/%s.d"
,
stage
);
char
*
name
=
path
+
sprintf
(
path
,
SECURE_DIR
"/%s.d"
,
stage
);
auto
dir
=
xopen_dir
(
path
);
auto
dir
=
xopen_dir
(
path
);
if
(
!
dir
)
if
(
!
dir
)
return
;
return
;
int
dfd
=
dirfd
(
dir
.
get
());
bool
pfs
=
stage
==
"post-fs-data"
sv
;
bool
pfs
=
stage
==
"post-fs-data"
sv
;
*
(
name
++
)
=
'/'
;
int
timer_pid
=
-
1
;
if
(
pfs
)
{
// Setup timer
clock_gettime
(
CLOCK_MONOTONIC
,
&
pfs_timeout
);
pfs_timeout
.
tv_sec
+=
POST_FS_DATA_SCRIPT_MAX_TIME
;
}
PFS_SETUP
()
*
(
name
++
)
=
'/'
;
int
dfd
=
dirfd
(
dir
.
get
());
for
(
dirent
*
entry
;
(
entry
=
xreaddir
(
dir
.
get
()));)
{
for
(
dirent
*
entry
;
(
entry
=
xreaddir
(
dir
.
get
()));)
{
if
(
entry
->
d_type
==
DT_REG
)
{
if
(
entry
->
d_type
==
DT_REG
)
{
if
(
faccessat
(
dfd
,
entry
->
d_name
,
X_OK
,
0
)
!=
0
)
if
(
faccessat
(
dfd
,
entry
->
d_name
,
X_OK
,
0
)
!=
0
)
...
@@ -54,20 +95,40 @@ void exec_common_scripts(const char *stage) {
...
@@ -54,20 +95,40 @@ void exec_common_scripts(const char *stage) {
strcpy
(
name
,
entry
->
d_name
);
strcpy
(
name
,
entry
->
d_name
);
exec_t
exec
{
exec_t
exec
{
.
pre_exec
=
set_script_env
,
.
pre_exec
=
set_script_env
,
.
fork
=
pfs
?
fork_no_zombie
:
fork_dont_care
.
fork
=
pfs
?
xfork
:
fork_dont_care
};
};
if
(
pfs
)
exec_command
(
exec
,
BBEXEC_CMD
,
path
);
exec_command_sync
(
exec
,
BBEXEC_CMD
,
path
);
PFS_WAIT
()
else
exec_command
(
exec
,
BBEXEC_CMD
,
path
);
}
}
}
}
PFS_DONE
()
}
// Return if a > b
static
bool
timespec_larger
(
timespec
*
a
,
timespec
*
b
)
{
if
(
a
->
tv_sec
!=
b
->
tv_sec
)
return
a
->
tv_sec
>
b
->
tv_sec
;
return
a
->
tv_nsec
>
b
->
tv_nsec
;
}
}
void
exec_module_scripts
(
const
char
*
stage
,
const
vector
<
string
>
&
module_list
)
{
void
exec_module_scripts
(
const
char
*
stage
,
const
vector
<
string
>
&
module_list
)
{
LOGI
(
"* Running module %s scripts
\n
"
,
stage
);
LOGI
(
"* Running module %s scripts
\n
"
,
stage
);
char
path
[
4096
];
if
(
module_list
.
empty
())
return
;
bool
pfs
=
stage
==
"post-fs-data"
sv
;
bool
pfs
=
stage
==
"post-fs-data"
sv
;
if
(
pfs
)
{
timespec
now
{};
clock_gettime
(
CLOCK_MONOTONIC
,
&
now
);
// If we had already timed out, treat it as service mode
if
(
timespec_larger
(
&
now
,
&
pfs_timeout
))
pfs
=
false
;
}
int
timer_pid
=
-
1
;
PFS_SETUP
()
char
path
[
4096
];
for
(
auto
&
m
:
module_list
)
{
for
(
auto
&
m
:
module_list
)
{
const
char
*
module
=
m
.
data
();
const
char
*
module
=
m
.
data
();
sprintf
(
path
,
MODULEROOT
"/%s/%s.sh"
,
module
,
stage
);
sprintf
(
path
,
MODULEROOT
"/%s/%s.sh"
,
module
,
stage
);
...
@@ -76,13 +137,13 @@ void exec_module_scripts(const char *stage, const vector<string> &module_list) {
...
@@ -76,13 +137,13 @@ void exec_module_scripts(const char *stage, const vector<string> &module_list) {
LOGI
(
"%s: exec [%s.sh]
\n
"
,
module
,
stage
);
LOGI
(
"%s: exec [%s.sh]
\n
"
,
module
,
stage
);
exec_t
exec
{
exec_t
exec
{
.
pre_exec
=
set_script_env
,
.
pre_exec
=
set_script_env
,
.
fork
=
pfs
?
fork_no_zombie
:
fork_dont_care
.
fork
=
pfs
?
xfork
:
fork_dont_care
};
};
if
(
pfs
)
exec_command
(
exec
,
BBEXEC_CMD
,
path
);
exec_command_sync
(
exec
,
BBEXEC_CMD
,
path
);
PFS_WAIT
()
else
exec_command
(
exec
,
BBEXEC_CMD
,
path
);
}
}
PFS_DONE
()
}
}
constexpr
char
install_script
[]
=
R"EOF(
constexpr
char
install_script
[]
=
R"EOF(
...
@@ -95,7 +156,7 @@ rm -f $APK
...
@@ -95,7 +156,7 @@ rm -f $APK
void
install_apk
(
const
char
*
apk
)
{
void
install_apk
(
const
char
*
apk
)
{
setfilecon
(
apk
,
"u:object_r:"
SEPOL_FILE_TYPE
":s0"
);
setfilecon
(
apk
,
"u:object_r:"
SEPOL_FILE_TYPE
":s0"
);
exec_t
exec
{
exec_t
exec
{
.
fork
=
fork_no_
zombie
.
fork
=
fork_no_
orphan
};
};
char
cmds
[
sizeof
(
install_script
)
+
4096
];
char
cmds
[
sizeof
(
install_script
)
+
4096
];
sprintf
(
cmds
,
install_script
,
apk
);
sprintf
(
cmds
,
install_script
,
apk
);
...
...
native/jni/include/magisk.hpp
View file @
eee7f097
...
@@ -27,6 +27,9 @@ extern std::string MAGISKTMP;
...
@@ -27,6 +27,9 @@ extern std::string MAGISKTMP;
constexpr
const
char
*
applet_names
[]
=
{
"su"
,
"resetprop"
,
"magiskhide"
,
nullptr
};
constexpr
const
char
*
applet_names
[]
=
{
"su"
,
"resetprop"
,
"magiskhide"
,
nullptr
};
constexpr
const
char
*
init_applet
[]
=
{
"magiskpolicy"
,
"supolicy"
,
nullptr
};
constexpr
const
char
*
init_applet
[]
=
{
"magiskpolicy"
,
"supolicy"
,
nullptr
};
#define POST_FS_DATA_WAIT_TIME 40
#define POST_FS_DATA_SCRIPT_MAX_TIME 35
// Multi-call entrypoints
// Multi-call entrypoints
int
magisk_main
(
int
argc
,
char
*
argv
[]);
int
magisk_main
(
int
argc
,
char
*
argv
[]);
int
magiskhide_main
(
int
argc
,
char
*
argv
[]);
int
magiskhide_main
(
int
argc
,
char
*
argv
[]);
...
...
native/jni/init/magiskrc.inc
View file @
eee7f097
#include <magisk.hpp>
#include <magisk.hpp>
#include <selinux.hpp>
#include <selinux.hpp>
#define quote(s) #s
#define str(s) quote(s)
constexpr
char
MAGISK_RC
[]
=
constexpr
char
MAGISK_RC
[]
=
"
\n
"
"
\n
"
...
@@ -8,7 +11,7 @@ constexpr char MAGISK_RC[] =
...
@@ -8,7 +11,7 @@ constexpr char MAGISK_RC[] =
" start logd
\n
"
" start logd
\n
"
" rm "
UNBLOCKFILE
"
\n
"
" rm "
UNBLOCKFILE
"
\n
"
" start %2
$s
\n
"
" start %2
$s
\n
"
" wait "
UNBLOCKFILE
"
40
\n
"
" wait "
UNBLOCKFILE
"
"
str
(
POST_FS_DATA_WAIT_TIME
)
"
\n
"
" rm "
UNBLOCKFILE
"
\n
"
" rm "
UNBLOCKFILE
"
\n
"
"
\n
"
"
\n
"
...
...
native/jni/utils/misc.cpp
View file @
eee7f097
/* misc.cpp - Store all functions that are unable to be catagorized clearly
*/
#include <sys/types.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/wait.h>
#include <sys/prctl.h>
#include <sys/prctl.h>
...
@@ -20,17 +17,16 @@
...
@@ -20,17 +17,16 @@
using
namespace
std
;
using
namespace
std
;
int
fork_dont_care
()
{
int
fork_dont_care
()
{
int
pid
=
xfork
();
if
(
int
pid
=
xfork
())
{
if
(
pid
)
{
waitpid
(
pid
,
nullptr
,
0
);
waitpid
(
pid
,
nullptr
,
0
);
return
pid
;
return
pid
;
}
else
if
(
(
pid
=
xfork
()
))
{
}
else
if
(
xfork
(
))
{
exit
(
0
);
exit
(
0
);
}
}
return
0
;
return
0
;
}
}
int
fork_no_
zombie
()
{
int
fork_no_
orphan
()
{
int
pid
=
xfork
();
int
pid
=
xfork
();
if
(
pid
)
if
(
pid
)
return
pid
;
return
pid
;
...
...
native/jni/utils/misc.hpp
View file @
eee7f097
...
@@ -67,7 +67,7 @@ int new_daemon_thread(std::function<void()> &&entry);
...
@@ -67,7 +67,7 @@ int new_daemon_thread(std::function<void()> &&entry);
bool
ends_with
(
const
std
::
string_view
&
s1
,
const
std
::
string_view
&
s2
);
bool
ends_with
(
const
std
::
string_view
&
s1
,
const
std
::
string_view
&
s2
);
int
fork_dont_care
();
int
fork_dont_care
();
int
fork_no_
zombie
();
int
fork_no_
orphan
();
int
strend
(
const
char
*
s1
,
const
char
*
s2
);
int
strend
(
const
char
*
s1
,
const
char
*
s2
);
void
init_argv0
(
int
argc
,
char
**
argv
);
void
init_argv0
(
int
argc
,
char
**
argv
);
void
set_nice_name
(
const
char
*
name
);
void
set_nice_name
(
const
char
*
name
);
...
...
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