Move su request path to magisk tmp

This commit is contained in:
vvb2060 2023-06-19 04:09:20 +08:00 committed by John Wu
parent 2359cfc480
commit 9929b25339
3 changed files with 30 additions and 43 deletions

View File

@ -13,6 +13,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import timber.log.Timber import timber.log.Timber
import java.io.DataOutputStream import java.io.DataOutputStream
import java.io.File
import java.io.FileOutputStream import java.io.FileOutputStream
import java.io.IOException import java.io.IOException
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
@ -22,7 +23,7 @@ class SuRequestHandler(
private val policyDB: PolicyDao private val policyDB: PolicyDao
) { ) {
private lateinit var output: DataOutputStream private lateinit var output: File
private lateinit var policy: SuPolicy private lateinit var policy: SuPolicy
lateinit var pkgInfo: PackageInfo lateinit var pkgInfo: PackageInfo
private set private set
@ -52,25 +53,15 @@ class SuRequestHandler(
return true return true
} }
private fun close() {
if (::output.isInitialized)
runCatching { output.close() }
}
private suspend fun init(intent: Intent): Boolean { private suspend fun init(intent: Intent): Boolean {
val uid = intent.getIntExtra("uid", -1) val uid = intent.getIntExtra("uid", -1)
if (uid <= 0) {
return false;
}
policy = SuPolicy(uid)
val pid = intent.getIntExtra("pid", -1) val pid = intent.getIntExtra("pid", -1)
if (pid <= 0) { val fifo = intent.getStringExtra("fifo")
return false; if (uid <= 0 || pid <= 0 || fifo == null) {
return false
} }
val fifo = intent.getStringExtra("fifo") ?: "/dev/socket/magisk_su_request_$pid" output = File(fifo)
policy = SuPolicy(uid)
try {
output = DataOutputStream(FileOutputStream(fifo))
try { try {
pkgInfo = pm.getPackageInfo(uid, pid) ?: PackageInfo().apply { pkgInfo = pm.getPackageInfo(uid, pid) ?: PackageInfo().apply {
val name = pm.getNameForUid(uid) ?: throw PackageManager.NameNotFoundException() val name = pm.getNameForUid(uid) ?: throw PackageManager.NameNotFoundException()
@ -82,12 +73,7 @@ class SuRequestHandler(
respond(SuPolicy.DENY, -1) respond(SuPolicy.DENY, -1)
return false return false
} }
return true return output.canWrite()
} catch (e: IOException) {
Timber.e(e)
close()
return false
}
} }
suspend fun respond(action: Int, time: Int) { suspend fun respond(action: Int, time: Int) {
@ -102,13 +88,14 @@ class SuRequestHandler(
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
try { try {
output.writeInt(policy.policy) DataOutputStream(FileOutputStream(output)).use {
output.flush() it.writeInt(policy.policy)
it.flush()
}
} catch (e: IOException) { } catch (e: IOException) {
Timber.e(e) Timber.e(e)
} finally { }
close() if (until >= 0) {
if (until >= 0)
policyDB.update(policy) policyDB.update(policy)
} }
} }

View File

@ -3,11 +3,10 @@
#include <base.hpp> #include <base.hpp>
#include <selinux.hpp> #include <selinux.hpp>
#include <magisk.hpp>
#include "su.hpp" #include "su.hpp"
extern int SDK_INT;
using namespace std; using namespace std;
#define CALL_PROVIDER \ #define CALL_PROVIDER \
@ -193,14 +192,15 @@ void app_notify(const su_context &ctx) {
int app_request(const su_context &ctx) { int app_request(const su_context &ctx) {
// Create FIFO // Create FIFO
char fifo[64]; char fifo[64];
ssprintf(fifo, sizeof(fifo), "/dev/socket/magisk_su_request_%d", ctx.pid); ssprintf(fifo, sizeof(fifo), "%s/" INTLROOT "/su_request_%d", MAGISKTMP.data(), ctx.pid);
mkfifo(fifo, 0600); mkfifo(fifo, 0600);
chown(fifo, ctx.info->mgr_uid, ctx.info->mgr_uid); chown(fifo, ctx.info->mgr_uid, ctx.info->mgr_uid);
setfilecon(fifo, MAGISK_FILE_CON); setfilecon(fifo, MAGISK_FILE_CON);
// Send request // Send request
vector<Extra> extras; vector<Extra> extras;
extras.reserve(2); extras.reserve(3);
extras.emplace_back("fifo", fifo);
extras.emplace_back("uid", ctx.info->eval_uid); extras.emplace_back("uid", ctx.info->eval_uid);
extras.emplace_back("pid", ctx.pid); extras.emplace_back("pid", ctx.pid);
exec_cmd("request", extras, ctx.info, false); exec_cmd("request", extras, ctx.info, false);

View File

@ -265,7 +265,7 @@ void MagiskInit::setup_tmp(const char *path) {
LOGD("Setup Magisk tmp at %s\n", path); LOGD("Setup Magisk tmp at %s\n", path);
chdir("/data"); chdir("/data");
xmkdir(INTLROOT, 0755); xmkdir(INTLROOT, 0711);
xmkdir(MIRRDIR, 0); xmkdir(MIRRDIR, 0);
xmkdir(BLOCKDIR, 0); xmkdir(BLOCKDIR, 0);
xmkdir(WORKERDIR, 0); xmkdir(WORKERDIR, 0);